package it.cavallium.dbengine.database.collections; import io.net5.buffer.api.Buffer; import io.net5.buffer.api.Resource; import io.net5.buffer.api.Send; import it.cavallium.dbengine.client.CompositeSnapshot; import it.cavallium.dbengine.database.LLDictionary; import it.cavallium.dbengine.database.LLUtils; import it.cavallium.dbengine.database.serialization.SerializerFixedBinaryLength; import java.util.Map; import org.jetbrains.annotations.Nullable; import reactor.core.publisher.Mono; public class SubStageGetterMapDeep> implements SubStageGetter, DatabaseMapDictionaryDeep> { private final SubStageGetter subStageGetter; private final SerializerFixedBinaryLength keySerializer; private final int keyExtLength; public SubStageGetterMapDeep(SubStageGetter subStageGetter, SerializerFixedBinaryLength keySerializer, int keyExtLength) { this.subStageGetter = subStageGetter; this.keySerializer = keySerializer; this.keyExtLength = keyExtLength; assert keyExtConsistency(); } private boolean keyExtConsistency() { if (subStageGetter instanceof SubStageGetterMapDeep) { return keyExtLength == ((SubStageGetterMapDeep) subStageGetter).getKeyBinaryLength(); } else if (subStageGetter instanceof SubStageGetterMap) { return keyExtLength == ((SubStageGetterMap) subStageGetter).getKeyBinaryLength(); } else { return true; } } @Override public Mono> subStage(LLDictionary dictionary, @Nullable CompositeSnapshot snapshot, Mono> prefixKeyMono) { return prefixKeyMono.map(prefixKeyToReceive -> { var prefixKey = prefixKeyToReceive.receive(); return DatabaseMapDictionaryDeep.deepIntermediate(dictionary, prefixKey, keySerializer, subStageGetter, keyExtLength, null ); }).doOnDiscard(Send.class, Send::close).doOnDiscard(Resource.class, Resource::close); } public int getKeyBinaryLength() { return keySerializer.getSerializedBinaryLength() + keyExtLength; } }