Use sorted maps
This commit is contained in:
parent
1de5e52ffd
commit
480ab77db8
@ -17,6 +17,9 @@ import it.cavallium.dbengine.database.serialization.SerializationException;
|
||||
import it.cavallium.dbengine.database.serialization.SerializationFunction;
|
||||
import it.cavallium.dbengine.database.serialization.Serializer;
|
||||
import it.cavallium.dbengine.database.serialization.SerializerFixedBinaryLength;
|
||||
import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap;
|
||||
import it.unimi.dsi.fastutil.objects.Object2ObjectSortedMap;
|
||||
import it.unimi.dsi.fastutil.objects.Object2ObjectSortedMaps;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedHashMap;
|
||||
@ -127,7 +130,7 @@ public class DatabaseMapDictionary<T, U> extends DatabaseMapDictionaryDeep<T, U,
|
||||
}
|
||||
|
||||
@Override
|
||||
public Mono<Map<T, U>> get(@Nullable CompositeSnapshot snapshot, boolean existsAlmostCertainly) {
|
||||
public Mono<Object2ObjectSortedMap<T, U>> get(@Nullable CompositeSnapshot snapshot, boolean existsAlmostCertainly) {
|
||||
return dictionary
|
||||
.getRange(resolveSnapshot(snapshot), rangeMono, existsAlmostCertainly)
|
||||
.<Entry<T, U>>handle((entrySend, sink) -> {
|
||||
@ -151,12 +154,13 @@ public class DatabaseMapDictionary<T, U> extends DatabaseMapDictionaryDeep<T, U,
|
||||
sink.error(ex);
|
||||
}
|
||||
})
|
||||
.collectMap(Entry::getKey, Entry::getValue, LinkedHashMap::new)
|
||||
.collectMap(Entry::getKey, Entry::getValue, Object2ObjectLinkedOpenHashMap::new)
|
||||
.map(map -> (Object2ObjectSortedMap<T, U>) map)
|
||||
.filter(map -> !map.isEmpty());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Mono<Map<T, U>> setAndGetPrevious(Map<T, U> value) {
|
||||
public Mono<Object2ObjectSortedMap<T, U>> setAndGetPrevious(Object2ObjectSortedMap<T, U> value) {
|
||||
return this
|
||||
.get(null, false)
|
||||
.concatWith(dictionary.setRange(rangeMono, Flux
|
||||
@ -168,9 +172,9 @@ public class DatabaseMapDictionary<T, U> extends DatabaseMapDictionaryDeep<T, U,
|
||||
}
|
||||
|
||||
@Override
|
||||
public Mono<Map<T, U>> clearAndGetPrevious() {
|
||||
public Mono<Object2ObjectSortedMap<T, U>> clearAndGetPrevious() {
|
||||
return this
|
||||
.setAndGetPrevious(Map.of());
|
||||
.setAndGetPrevious(Object2ObjectSortedMaps.emptyMap());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -17,6 +17,9 @@ import io.net5.buffer.api.internal.ResourceSupport;
|
||||
import it.cavallium.dbengine.database.UpdateMode;
|
||||
import it.cavallium.dbengine.database.serialization.SerializationException;
|
||||
import it.cavallium.dbengine.database.serialization.SerializerFixedBinaryLength;
|
||||
import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap;
|
||||
import it.unimi.dsi.fastutil.objects.Object2ObjectSortedMap;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
@ -27,8 +30,9 @@ import reactor.core.publisher.Flux;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
// todo: implement optimized methods (which?)
|
||||
public class DatabaseMapDictionaryDeep<T, U, US extends DatabaseStage<U>> extends ResourceSupport<DatabaseStage<Map<T, U>>, DatabaseMapDictionaryDeep<T, U, US>>
|
||||
implements DatabaseStageMap<T, U, US> {
|
||||
public class DatabaseMapDictionaryDeep<T, U, US extends DatabaseStage<U>> extends
|
||||
ResourceSupport<DatabaseStage<Object2ObjectSortedMap<T, U>>, DatabaseMapDictionaryDeep<T, U, US>> implements
|
||||
DatabaseStageMap<T, U, US> {
|
||||
|
||||
private static final Logger logger = LogManager.getLogger(DatabaseMapDictionaryDeep.class);
|
||||
|
||||
|
@ -14,6 +14,8 @@ import io.net5.buffer.api.internal.ResourceSupport;
|
||||
import it.cavallium.dbengine.database.UpdateMode;
|
||||
import it.cavallium.dbengine.database.serialization.Serializer;
|
||||
import it.cavallium.dbengine.database.serialization.SerializerFixedBinaryLength;
|
||||
import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap;
|
||||
import it.unimi.dsi.fastutil.objects.Object2ObjectSortedMap;
|
||||
import it.unimi.dsi.fastutil.objects.ObjectArraySet;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
@ -30,8 +32,9 @@ import reactor.core.publisher.Flux;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public class DatabaseMapDictionaryHashed<T, U, TH> extends ResourceSupport<DatabaseStage<Map<T, U>>, DatabaseMapDictionaryHashed<T, U, TH>>
|
||||
implements DatabaseStageMap<T, U, DatabaseStageEntry<U>> {
|
||||
public class DatabaseMapDictionaryHashed<T, U, TH> extends
|
||||
ResourceSupport<DatabaseStage<Object2ObjectSortedMap<T, U>>, DatabaseMapDictionaryHashed<T, U, TH>> implements
|
||||
DatabaseStageMap<T, U, DatabaseStageEntry<U>> {
|
||||
|
||||
private static final Logger logger = LogManager.getLogger(DatabaseMapDictionaryHashed.class);
|
||||
|
||||
@ -88,7 +91,7 @@ public class DatabaseMapDictionaryHashed<T, U, TH> extends ResourceSupport<Datab
|
||||
@SuppressWarnings({"unchecked", "rawtypes"})
|
||||
private DatabaseMapDictionaryHashed(BufferAllocator alloc,
|
||||
Function<T, TH> keySuffixHashFunction,
|
||||
Send<DatabaseStage<Map<TH, ObjectArraySet<Entry<T, U>>>>> subDictionary,
|
||||
Send<DatabaseStage<Object2ObjectSortedMap<TH, ObjectArraySet<Entry<T, U>>>>> subDictionary,
|
||||
Drop<DatabaseMapDictionaryHashed<T, U, TH>> drop) {
|
||||
super((Drop<DatabaseMapDictionaryHashed<T, U, TH>>) (Drop) DROP);
|
||||
this.alloc = alloc;
|
||||
@ -131,8 +134,8 @@ public class DatabaseMapDictionaryHashed<T, U, TH> extends ResourceSupport<Datab
|
||||
);
|
||||
}
|
||||
|
||||
private Map<TH, ObjectArraySet<Entry<T, U>>> serializeMap(Map<T, U> map) {
|
||||
var newMap = new HashMap<TH, ObjectArraySet<Entry<T, U>>>(map.size());
|
||||
private Object2ObjectSortedMap<TH, ObjectArraySet<Entry<T, U>>> serializeMap(Object2ObjectSortedMap<T, U> map) {
|
||||
var newMap = new Object2ObjectLinkedOpenHashMap<TH, ObjectArraySet<Entry<T, U>>>(map.size());
|
||||
map.forEach((key, value) -> newMap.compute(keySuffixHashFunction.apply(key), (hash, prev) -> {
|
||||
if (prev == null) {
|
||||
prev = new ObjectArraySet<>();
|
||||
@ -143,29 +146,30 @@ public class DatabaseMapDictionaryHashed<T, U, TH> extends ResourceSupport<Datab
|
||||
return newMap;
|
||||
}
|
||||
|
||||
private Map<T, U> deserializeMap(Map<TH, ObjectArraySet<Entry<T, U>>> map) {
|
||||
var newMap = new HashMap<T, U>(map.size());
|
||||
private Object2ObjectSortedMap<T, U> deserializeMap(Object2ObjectSortedMap<TH, ObjectArraySet<Entry<T, U>>> map) {
|
||||
var newMap = new Object2ObjectLinkedOpenHashMap<T, U>(map.size());
|
||||
map.forEach((hash, set) -> set.forEach(entry -> newMap.put(entry.getKey(), entry.getValue())));
|
||||
return newMap;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Mono<Map<T, U>> get(@Nullable CompositeSnapshot snapshot) {
|
||||
public Mono<Object2ObjectSortedMap<T, U>> get(@Nullable CompositeSnapshot snapshot) {
|
||||
return subDictionary.get(snapshot).map(this::deserializeMap);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Mono<Map<T, U>> getOrDefault(@Nullable CompositeSnapshot snapshot, Mono<Map<T, U>> defaultValue) {
|
||||
public Mono<Object2ObjectSortedMap<T, U>> getOrDefault(@Nullable CompositeSnapshot snapshot,
|
||||
Mono<Object2ObjectSortedMap<T, U>> defaultValue) {
|
||||
return this.get(snapshot).switchIfEmpty(defaultValue);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Mono<Void> set(Map<T, U> map) {
|
||||
public Mono<Void> set(Object2ObjectSortedMap<T, U> map) {
|
||||
return Mono.fromSupplier(() -> this.serializeMap(map)).flatMap(subDictionary::set);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Mono<Boolean> setAndGetChanged(Map<T, U> map) {
|
||||
public Mono<Boolean> setAndGetChanged(Object2ObjectSortedMap<T, U> map) {
|
||||
return Mono.fromSupplier(() -> this.serializeMap(map)).flatMap(subDictionary::setAndGetChanged).single();
|
||||
}
|
||||
|
||||
@ -180,7 +184,7 @@ public class DatabaseMapDictionaryHashed<T, U, TH> extends ResourceSupport<Datab
|
||||
}
|
||||
|
||||
@Override
|
||||
public DatabaseStageEntry<Map<T, U>> entry() {
|
||||
public DatabaseStageEntry<Object2ObjectSortedMap<T, U>> entry() {
|
||||
return this;
|
||||
}
|
||||
|
||||
@ -247,7 +251,7 @@ public class DatabaseMapDictionaryHashed<T, U, TH> extends ResourceSupport<Datab
|
||||
}
|
||||
|
||||
@Override
|
||||
public Mono<Map<T, U>> setAndGetPrevious(Map<T, U> value) {
|
||||
public Mono<Object2ObjectSortedMap<T, U>> setAndGetPrevious(Object2ObjectSortedMap<T, U> value) {
|
||||
return Mono
|
||||
.fromSupplier(() -> this.serializeMap(value))
|
||||
.flatMap(subDictionary::setAndGetPrevious)
|
||||
@ -255,14 +259,14 @@ public class DatabaseMapDictionaryHashed<T, U, TH> extends ResourceSupport<Datab
|
||||
}
|
||||
|
||||
@Override
|
||||
public Mono<Map<T, U>> clearAndGetPrevious() {
|
||||
public Mono<Object2ObjectSortedMap<T, U>> clearAndGetPrevious() {
|
||||
return subDictionary
|
||||
.clearAndGetPrevious()
|
||||
.map(this::deserializeMap);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Mono<Map<T, U>> get(@Nullable CompositeSnapshot snapshot, boolean existsAlmostCertainly) {
|
||||
public Mono<Object2ObjectSortedMap<T, U>> get(@Nullable CompositeSnapshot snapshot, boolean existsAlmostCertainly) {
|
||||
return subDictionary
|
||||
.get(snapshot, existsAlmostCertainly)
|
||||
.map(this::deserializeMap);
|
||||
|
@ -8,6 +8,7 @@ import it.cavallium.dbengine.database.LLDictionary;
|
||||
import it.cavallium.dbengine.database.LLUtils;
|
||||
import it.cavallium.dbengine.database.collections.DatabaseEmpty.Nothing;
|
||||
import it.cavallium.dbengine.database.serialization.SerializerFixedBinaryLength;
|
||||
import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
@ -42,7 +43,7 @@ public class DatabaseSetDictionary<T> extends DatabaseMapDictionary<T, Nothing>
|
||||
}
|
||||
|
||||
public Mono<Set<T>> setAndGetPreviousKeySet(Set<T> value) {
|
||||
var hm = new HashMap<T, Nothing>();
|
||||
var hm = new Object2ObjectLinkedOpenHashMap<T, Nothing>();
|
||||
for (T t : value) {
|
||||
hm.put(t, DatabaseEmpty.NOTHING);
|
||||
}
|
||||
|
@ -9,6 +9,7 @@ import it.cavallium.dbengine.database.LLUtils;
|
||||
import it.cavallium.dbengine.database.collections.DatabaseEmpty.Nothing;
|
||||
import it.cavallium.dbengine.database.serialization.Serializer;
|
||||
import it.cavallium.dbengine.database.serialization.SerializerFixedBinaryLength;
|
||||
import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
@ -70,7 +71,7 @@ public class DatabaseSetDictionaryHashed<T, TH> extends DatabaseMapDictionaryHas
|
||||
}
|
||||
|
||||
public Mono<Set<T>> setAndGetPreviousKeySet(Set<T> value) {
|
||||
var hm = new HashMap<T, Nothing>();
|
||||
var hm = new Object2ObjectLinkedOpenHashMap<T, Nothing>();
|
||||
for (T t : value) {
|
||||
hm.put(t, DatabaseEmpty.NOTHING);
|
||||
}
|
||||
|
@ -9,8 +9,10 @@ import it.cavallium.dbengine.database.UpdateReturnMode;
|
||||
import it.cavallium.dbengine.database.serialization.KVSerializationFunction;
|
||||
import it.cavallium.dbengine.database.serialization.SerializationException;
|
||||
import it.cavallium.dbengine.database.serialization.SerializationFunction;
|
||||
import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap;
|
||||
import it.unimi.dsi.fastutil.objects.Object2ObjectSortedMap;
|
||||
import it.unimi.dsi.fastutil.objects.Object2ObjectSortedMaps;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.Objects;
|
||||
@ -23,7 +25,8 @@ import reactor.util.function.Tuple2;
|
||||
import reactor.util.function.Tuples;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public interface DatabaseStageMap<T, U, US extends DatabaseStage<U>> extends DatabaseStageEntry<Map<T, U>> {
|
||||
public interface DatabaseStageMap<T, U, US extends DatabaseStage<U>> extends
|
||||
DatabaseStageEntry<Object2ObjectSortedMap<T, U>> {
|
||||
|
||||
Mono<US> at(@Nullable CompositeSnapshot snapshot, T key);
|
||||
|
||||
@ -185,15 +188,16 @@ public interface DatabaseStageMap<T, U, US extends DatabaseStage<U>> extends Dat
|
||||
}
|
||||
|
||||
@Override
|
||||
default Mono<Map<T, U>> setAndGetPrevious(Map<T, U> value) {
|
||||
default Mono<Object2ObjectSortedMap<T, U>> setAndGetPrevious(Object2ObjectSortedMap<T, U> value) {
|
||||
return this
|
||||
.setAllValuesAndGetPrevious(Flux.fromIterable(Map.copyOf(value).entrySet()))
|
||||
.collectMap(Entry::getKey, Entry::getValue, LinkedHashMap::new)
|
||||
.setAllValuesAndGetPrevious(Flux.fromIterable(value.entrySet()))
|
||||
.collectMap(Entry::getKey, Entry::getValue, Object2ObjectLinkedOpenHashMap::new)
|
||||
.map(map -> (Object2ObjectSortedMap<T, U>) map)
|
||||
.filter(map -> !map.isEmpty());
|
||||
}
|
||||
|
||||
@Override
|
||||
default Mono<Boolean> setAndGetChanged(Map<T, U> value) {
|
||||
default Mono<Boolean> setAndGetChanged(Object2ObjectSortedMap<T, U> value) {
|
||||
return this
|
||||
.setAndGetPrevious(value)
|
||||
.map(oldValue -> !Objects.equals(oldValue, value.isEmpty() ? null : value))
|
||||
@ -201,7 +205,7 @@ public interface DatabaseStageMap<T, U, US extends DatabaseStage<U>> extends Dat
|
||||
}
|
||||
|
||||
@Override
|
||||
default Mono<Delta<Map<T, U>>> updateAndGetDelta(SerializationFunction<@Nullable Map<T, U>, @Nullable Map<T, U>> updater,
|
||||
default Mono<Delta<Object2ObjectSortedMap<T, U>>> updateAndGetDelta(SerializationFunction<@Nullable Object2ObjectSortedMap<T, U>, @Nullable Object2ObjectSortedMap<T, U>> updater,
|
||||
boolean existsAlmostCertainly) {
|
||||
return this
|
||||
.getUpdateMode()
|
||||
@ -210,9 +214,10 @@ public interface DatabaseStageMap<T, U, US extends DatabaseStage<U>> extends Dat
|
||||
if (updateMode == UpdateMode.ALLOW_UNSAFE) {
|
||||
return this
|
||||
.getAllValues(null)
|
||||
.collectMap(Entry::getKey, Entry::getValue, LinkedHashMap::new)
|
||||
.collectMap(Entry::getKey, Entry::getValue, Object2ObjectLinkedOpenHashMap::new)
|
||||
.map(map -> (Object2ObjectSortedMap<T, U>) map)
|
||||
.single()
|
||||
.<Tuple2<Optional<Map<T, U>>, Optional<Map<T, U>>>>handle((v, sink) -> {
|
||||
.<Tuple2<Optional<Object2ObjectSortedMap<T, U>>, Optional<Object2ObjectSortedMap<T, U>>>>handle((v, sink) -> {
|
||||
if (v.isEmpty()) {
|
||||
v = null;
|
||||
}
|
||||
@ -228,7 +233,7 @@ public interface DatabaseStageMap<T, U, US extends DatabaseStage<U>> extends Dat
|
||||
})
|
||||
.flatMap(result -> Mono
|
||||
.justOrEmpty(result.getT2())
|
||||
.flatMap(values -> this.setAllValues(Flux.fromIterable(Map.copyOf(values).entrySet())))
|
||||
.flatMap(values -> this.setAllValues(Flux.fromIterable(values.entrySet())))
|
||||
.thenReturn(new Delta<>(result.getT1().orElse(null), result.getT2().orElse(null)))
|
||||
);
|
||||
} else if (updateMode == UpdateMode.ALLOW) {
|
||||
@ -248,15 +253,16 @@ public interface DatabaseStageMap<T, U, US extends DatabaseStage<U>> extends Dat
|
||||
}
|
||||
|
||||
@Override
|
||||
default Mono<Map<T, U>> clearAndGetPrevious() {
|
||||
return this.setAndGetPrevious(Map.of());
|
||||
default Mono<Object2ObjectSortedMap<T, U>> clearAndGetPrevious() {
|
||||
return this.setAndGetPrevious(Object2ObjectSortedMaps.emptyMap());
|
||||
}
|
||||
|
||||
@Override
|
||||
default Mono<Map<T, U>> get(@Nullable CompositeSnapshot snapshot, boolean existsAlmostCertainly) {
|
||||
default Mono<Object2ObjectSortedMap<T, U>> get(@Nullable CompositeSnapshot snapshot, boolean existsAlmostCertainly) {
|
||||
return this
|
||||
.getAllValues(snapshot)
|
||||
.collectMap(Entry::getKey, Entry::getValue, LinkedHashMap::new)
|
||||
.collectMap(Entry::getKey, Entry::getValue, Object2ObjectLinkedOpenHashMap::new)
|
||||
.map(map -> (Object2ObjectSortedMap<T, U>) map)
|
||||
.filter(map -> !map.isEmpty());
|
||||
}
|
||||
|
||||
|
@ -8,6 +8,7 @@ import it.cavallium.dbengine.database.LLDictionary;
|
||||
import it.cavallium.dbengine.database.LLUtils;
|
||||
import it.cavallium.dbengine.database.serialization.Serializer;
|
||||
import it.cavallium.dbengine.database.serialization.SerializerFixedBinaryLength;
|
||||
import it.unimi.dsi.fastutil.objects.Object2ObjectSortedMap;
|
||||
import java.util.Map;
|
||||
import java.util.function.Function;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
@ -15,7 +16,7 @@ import reactor.core.publisher.Mono;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public class SubStageGetterHashMap<T, U, TH> implements
|
||||
SubStageGetter<Map<T, U>, DatabaseMapDictionaryHashed<T, U, TH>> {
|
||||
SubStageGetter<Object2ObjectSortedMap<T, U>, DatabaseMapDictionaryHashed<T, U, TH>> {
|
||||
|
||||
private final Serializer<T> keySerializer;
|
||||
private final Serializer<U> valueSerializer;
|
||||
|
@ -9,6 +9,7 @@ import it.cavallium.dbengine.database.LLUtils;
|
||||
import it.cavallium.dbengine.database.collections.DatabaseEmpty.Nothing;
|
||||
import it.cavallium.dbengine.database.serialization.Serializer;
|
||||
import it.cavallium.dbengine.database.serialization.SerializerFixedBinaryLength;
|
||||
import it.unimi.dsi.fastutil.objects.Object2ObjectSortedMap;
|
||||
import java.util.Map;
|
||||
import java.util.function.Function;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
@ -16,7 +17,7 @@ import reactor.core.publisher.Mono;
|
||||
|
||||
@SuppressWarnings({"unused", "ClassCanBeRecord"})
|
||||
public class SubStageGetterHashSet<T, TH> implements
|
||||
SubStageGetter<Map<T, Nothing>, DatabaseSetDictionaryHashed<T, TH>> {
|
||||
SubStageGetter<Object2ObjectSortedMap<T, Nothing>, DatabaseSetDictionaryHashed<T, TH>> {
|
||||
|
||||
private final Serializer<T> keySerializer;
|
||||
private final Function<T, TH> keyHashFunction;
|
||||
|
@ -8,11 +8,13 @@ import it.cavallium.dbengine.database.LLDictionary;
|
||||
import it.cavallium.dbengine.database.LLUtils;
|
||||
import it.cavallium.dbengine.database.serialization.Serializer;
|
||||
import it.cavallium.dbengine.database.serialization.SerializerFixedBinaryLength;
|
||||
import it.unimi.dsi.fastutil.objects.Object2ObjectSortedMap;
|
||||
import java.util.Map;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
public class SubStageGetterMap<T, U> implements SubStageGetter<Map<T, U>, DatabaseMapDictionary<T, U>> {
|
||||
public class SubStageGetterMap<T, U> implements
|
||||
SubStageGetter<Object2ObjectSortedMap<T, U>, DatabaseMapDictionary<T, U>> {
|
||||
|
||||
private final SerializerFixedBinaryLength<T> keySerializer;
|
||||
private final Serializer<U> valueSerializer;
|
||||
|
@ -7,12 +7,13 @@ 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 it.unimi.dsi.fastutil.objects.Object2ObjectSortedMap;
|
||||
import java.util.Map;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
public class SubStageGetterMapDeep<T, U, US extends DatabaseStage<U>> implements
|
||||
SubStageGetter<Map<T, U>, DatabaseMapDictionaryDeep<T, U, US>> {
|
||||
SubStageGetter<Object2ObjectSortedMap<T, U>, DatabaseMapDictionaryDeep<T, U, US>> {
|
||||
|
||||
private final SubStageGetter<U, US> subStageGetter;
|
||||
private final SerializerFixedBinaryLength<T> keySerializer;
|
||||
|
@ -7,11 +7,13 @@ import it.cavallium.dbengine.client.CompositeSnapshot;
|
||||
import it.cavallium.dbengine.database.LLDictionary;
|
||||
import it.cavallium.dbengine.database.collections.DatabaseEmpty.Nothing;
|
||||
import it.cavallium.dbengine.database.serialization.SerializerFixedBinaryLength;
|
||||
import it.unimi.dsi.fastutil.objects.Object2ObjectSortedMap;
|
||||
import java.util.Map;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
public class SubStageGetterSet<T> implements SubStageGetter<Map<T, Nothing>, DatabaseSetDictionary<T>> {
|
||||
public class SubStageGetterSet<T> implements
|
||||
SubStageGetter<Object2ObjectSortedMap<T, Nothing>, DatabaseSetDictionary<T>> {
|
||||
|
||||
private final SerializerFixedBinaryLength<T> keySerializer;
|
||||
|
||||
|
@ -24,6 +24,7 @@ import it.cavallium.dbengine.lucene.mlt.BigCompositeReader;
|
||||
import it.cavallium.dbengine.lucene.mlt.MultiMoreLikeThis;
|
||||
import it.cavallium.dbengine.lucene.searcher.LocalQueryParams;
|
||||
import it.cavallium.dbengine.lucene.similarity.NGramSimilarity;
|
||||
import it.unimi.dsi.fastutil.objects.Object2ObjectSortedMap;
|
||||
import java.io.EOFException;
|
||||
import java.io.IOException;
|
||||
import java.nio.ByteBuffer;
|
||||
@ -224,7 +225,7 @@ public class LuceneUtils {
|
||||
|
||||
public static <T, U, V> ValueGetter<Entry<T, U>, V> getAsyncDbValueGetterDeep(
|
||||
CompositeSnapshot snapshot,
|
||||
DatabaseMapDictionaryDeep<T, Map<U, V>, DatabaseMapDictionary<U, V>> dictionaryDeep) {
|
||||
DatabaseMapDictionaryDeep<T, Object2ObjectSortedMap<U, V>, DatabaseMapDictionary<U, V>> dictionaryDeep) {
|
||||
return entry -> LLUtils.usingResource(dictionaryDeep
|
||||
.at(snapshot, entry.getKey()), sub -> sub.getValue(snapshot, entry.getValue()), true);
|
||||
}
|
||||
|
@ -27,6 +27,7 @@ import it.cavallium.dbengine.database.disk.MemorySegmentUtils;
|
||||
import it.cavallium.dbengine.database.serialization.SerializationException;
|
||||
import it.cavallium.dbengine.database.serialization.Serializer;
|
||||
import it.cavallium.dbengine.database.serialization.SerializerFixedBinaryLength;
|
||||
import it.unimi.dsi.fastutil.objects.Object2ObjectSortedMap;
|
||||
import java.nio.file.Path;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
@ -188,7 +189,7 @@ public class DbTestUtils {
|
||||
}
|
||||
}
|
||||
|
||||
public static DatabaseMapDictionaryDeep<String, Map<String, String>,
|
||||
public static DatabaseMapDictionaryDeep<String, Object2ObjectSortedMap<String, String>,
|
||||
DatabaseMapDictionary<String, String>> tempDatabaseMapDictionaryDeepMap(
|
||||
LLDictionary dictionary,
|
||||
int key1Bytes,
|
||||
@ -203,7 +204,7 @@ public class DbTestUtils {
|
||||
);
|
||||
}
|
||||
|
||||
public static DatabaseMapDictionaryDeep<String, Map<String, String>,
|
||||
public static DatabaseMapDictionaryDeep<String, Object2ObjectSortedMap<String, String>,
|
||||
DatabaseMapDictionaryHashed<String, String, Integer>> tempDatabaseMapDictionaryDeepMapHashMap(
|
||||
LLDictionary dictionary,
|
||||
int key1Bytes) {
|
||||
|
@ -6,6 +6,9 @@ import static it.cavallium.dbengine.SyncUtils.*;
|
||||
import it.cavallium.dbengine.database.LLUtils;
|
||||
import it.cavallium.dbengine.DbTestUtils.TestAllocator;
|
||||
import it.cavallium.dbengine.database.UpdateMode;
|
||||
import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap;
|
||||
import it.unimi.dsi.fastutil.objects.Object2ObjectSortedMap;
|
||||
import it.unimi.dsi.fastutil.objects.Object2ObjectSortedMaps;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@ -114,7 +117,7 @@ public abstract class TestDictionaryMap {
|
||||
Assertions.assertEquals(shouldFail ? 0 : 1, resultingMapSize);
|
||||
|
||||
var resultingMap = run(map.get(null));
|
||||
Assertions.assertEquals(shouldFail ? null : Map.of(key, value), resultingMap);
|
||||
Assertions.assertEquals(shouldFail ? null : Object2ObjectSortedMaps.singleton(key, value), resultingMap);
|
||||
|
||||
map.close();
|
||||
|
||||
@ -355,17 +358,16 @@ public abstract class TestDictionaryMap {
|
||||
} else {
|
||||
badKeys = List.of();
|
||||
}
|
||||
List<Tuple2<List<String>, Boolean>> keys = Stream.concat(
|
||||
goodKeys.stream().map(s -> Tuples.of(s, false)),
|
||||
badKeys.stream().map(s -> Tuples.of(s, true))
|
||||
).collect(Collectors.toList());
|
||||
List<Tuple2<List<String>, Boolean>> keys = Stream
|
||||
.concat(goodKeys.stream().map(s -> Tuples.of(s, false)), badKeys.stream().map(s -> Tuples.of(s, true)))
|
||||
.toList();
|
||||
var values = isCIMode() ? List.of("val") : List.of("", "\0", BIG_STRING);
|
||||
|
||||
return keys
|
||||
.stream()
|
||||
.map(keyTuple -> keyTuple.mapT1(ks -> Flux
|
||||
.zip(Flux.fromIterable(ks), Flux.fromIterable(values))
|
||||
.collectMap(Tuple2::getT1, Tuple2::getT2)
|
||||
.collectMap(Tuple2::getT1, Tuple2::getT2, Object2ObjectLinkedOpenHashMap::new)
|
||||
.block()
|
||||
))
|
||||
.flatMap(entryTuple -> Arrays.stream(UpdateMode.values()).map(updateMode -> Tuples.of(updateMode,
|
||||
@ -385,7 +387,7 @@ public abstract class TestDictionaryMap {
|
||||
|
||||
@ParameterizedTest
|
||||
@MethodSource("provideArgumentsPutMulti")
|
||||
public void testPutMultiGetMulti(MapType mapType, UpdateMode updateMode, Map<String, String> entries, boolean shouldFail) {
|
||||
public void testPutMultiGetMulti(MapType mapType, UpdateMode updateMode, Object2ObjectSortedMap<String, String> entries, boolean shouldFail) {
|
||||
var remainingEntries = new ConcurrentHashMap<Entry<String, String>, Boolean>().keySet(true);
|
||||
Step<Entry<String, String>> stpVer = StepVerifier
|
||||
.create(tempDb(getTempDbGenerator(), allocator, db -> tempDictionary(db, updateMode)
|
||||
@ -419,7 +421,7 @@ public abstract class TestDictionaryMap {
|
||||
|
||||
@ParameterizedTest
|
||||
@MethodSource("provideArgumentsPutMulti")
|
||||
public void testSetAllValuesGetMulti(MapType mapType, UpdateMode updateMode, Map<String, String> entries, boolean shouldFail) {
|
||||
public void testSetAllValuesGetMulti(MapType mapType, UpdateMode updateMode, Object2ObjectSortedMap<String, String> entries, boolean shouldFail) {
|
||||
var remainingEntries = new ConcurrentHashMap<Entry<String, String>, Boolean>().keySet(true);
|
||||
Step<Entry<String, String>> stpVer = StepVerifier
|
||||
.create(tempDb(getTempDbGenerator(), allocator, db -> tempDictionary(db, updateMode)
|
||||
@ -450,7 +452,7 @@ public abstract class TestDictionaryMap {
|
||||
|
||||
@ParameterizedTest
|
||||
@MethodSource("provideArgumentsPutMulti")
|
||||
public void testSetAllValuesAndGetPrevious(MapType mapType, UpdateMode updateMode, Map<String, String> entries, boolean shouldFail) {
|
||||
public void testSetAllValuesAndGetPrevious(MapType mapType, UpdateMode updateMode, Object2ObjectSortedMap<String, String> entries, boolean shouldFail) {
|
||||
var remainingEntries = new ConcurrentHashMap<Entry<String, String>, Boolean>().keySet(true);
|
||||
Step<Entry<String, String>> stpVer = StepVerifier
|
||||
.create(tempDb(getTempDbGenerator(), allocator, db -> tempDictionary(db, updateMode)
|
||||
@ -478,7 +480,10 @@ public abstract class TestDictionaryMap {
|
||||
|
||||
@ParameterizedTest
|
||||
@MethodSource("provideArgumentsPutMulti")
|
||||
public void testSetGetMulti(MapType mapType, UpdateMode updateMode, Map<String, String> entries, boolean shouldFail) {
|
||||
public void testSetGetMulti(MapType mapType,
|
||||
UpdateMode updateMode,
|
||||
Object2ObjectSortedMap<String, String> entries,
|
||||
boolean shouldFail) {
|
||||
var remainingEntries = new ConcurrentHashMap<Entry<String, String>, Boolean>().keySet(true);
|
||||
Step<Entry<String, String>> stpVer = StepVerifier
|
||||
.create(tempDb(getTempDbGenerator(), allocator, db -> tempDictionary(db, updateMode)
|
||||
@ -513,7 +518,7 @@ public abstract class TestDictionaryMap {
|
||||
@MethodSource("provideArgumentsPutMulti")
|
||||
public void testSetAndGetChanged(MapType mapType,
|
||||
UpdateMode updateMode,
|
||||
Map<String, String> entries,
|
||||
Object2ObjectSortedMap<String, String> entries,
|
||||
boolean shouldFail) {
|
||||
Step<Boolean> stpVer = StepVerifier
|
||||
.create(tempDb(getTempDbGenerator(), allocator, db -> tempDictionary(db, updateMode)
|
||||
@ -545,7 +550,10 @@ public abstract class TestDictionaryMap {
|
||||
|
||||
@ParameterizedTest
|
||||
@MethodSource("provideArgumentsPutMulti")
|
||||
public void testSetAndGetPrevious(MapType mapType, UpdateMode updateMode, Map<String, String> entries, boolean shouldFail) {
|
||||
public void testSetAndGetPrevious(MapType mapType,
|
||||
UpdateMode updateMode,
|
||||
Object2ObjectSortedMap<String, String> entries,
|
||||
boolean shouldFail) {
|
||||
var remainingEntries = new ConcurrentHashMap<Entry<String, String>, Boolean>().keySet(true);
|
||||
Step<Entry<String, String>> stpVer = StepVerifier
|
||||
.create(tempDb(getTempDbGenerator(), allocator, db -> tempDictionary(db, updateMode)
|
||||
@ -571,7 +579,10 @@ public abstract class TestDictionaryMap {
|
||||
|
||||
@ParameterizedTest
|
||||
@MethodSource("provideArgumentsPutMulti")
|
||||
public void testSetClearAndGetPreviousGet(MapType mapType, UpdateMode updateMode, Map<String, String> entries, boolean shouldFail) {
|
||||
public void testSetClearAndGetPreviousGet(MapType mapType,
|
||||
UpdateMode updateMode,
|
||||
Object2ObjectSortedMap<String, String> entries,
|
||||
boolean shouldFail) {
|
||||
var remainingEntries = new ConcurrentHashMap<Entry<String, String>, Boolean>().keySet(true);
|
||||
Step<Entry<String, String>> stpVer = StepVerifier
|
||||
.create(tempDb(getTempDbGenerator(), allocator, db -> tempDictionary(db, updateMode)
|
||||
@ -597,7 +608,7 @@ public abstract class TestDictionaryMap {
|
||||
|
||||
@ParameterizedTest
|
||||
@MethodSource("provideArgumentsPutMulti")
|
||||
public void testPutMultiGetAllValues(MapType mapType, UpdateMode updateMode, Map<String, String> entries, boolean shouldFail) {
|
||||
public void testPutMultiGetAllValues(MapType mapType, UpdateMode updateMode, Object2ObjectSortedMap<String, String> entries, boolean shouldFail) {
|
||||
var remainingEntries = new ConcurrentHashMap<Entry<String, String>, Boolean>().keySet(true);
|
||||
Step<Entry<String, String>> stpVer = StepVerifier
|
||||
.create(tempDb(getTempDbGenerator(), allocator, db -> tempDictionary(db, updateMode)
|
||||
@ -625,7 +636,7 @@ public abstract class TestDictionaryMap {
|
||||
|
||||
@ParameterizedTest
|
||||
@MethodSource("provideArgumentsPutMulti")
|
||||
public void testPutMultiGet(MapType mapType, UpdateMode updateMode, Map<String, String> entries, boolean shouldFail) {
|
||||
public void testPutMultiGet(MapType mapType, UpdateMode updateMode, Object2ObjectSortedMap<String, String> entries, boolean shouldFail) {
|
||||
var remainingEntries = new ConcurrentHashMap<Entry<String, String>, Boolean>().keySet(true);
|
||||
Step<Entry<String, String>> stpVer = StepVerifier
|
||||
.create(tempDb(getTempDbGenerator(), allocator, db -> tempDictionary(db, updateMode)
|
||||
@ -655,7 +666,7 @@ public abstract class TestDictionaryMap {
|
||||
|
||||
@ParameterizedTest
|
||||
@MethodSource("provideArgumentsPutMulti")
|
||||
public void testPutMultiGetAllStagesGet(MapType mapType, UpdateMode updateMode, Map<String, String> entries, boolean shouldFail) {
|
||||
public void testPutMultiGetAllStagesGet(MapType mapType, UpdateMode updateMode, Object2ObjectSortedMap<String, String> entries, boolean shouldFail) {
|
||||
var remainingEntries = new ConcurrentHashMap<Entry<String, String>, Boolean>().keySet(true);
|
||||
Step<Entry<String, String>> stpVer = StepVerifier
|
||||
.create(tempDb(getTempDbGenerator(), allocator, db -> tempDictionary(db, updateMode)
|
||||
@ -690,7 +701,7 @@ public abstract class TestDictionaryMap {
|
||||
|
||||
@ParameterizedTest
|
||||
@MethodSource("provideArgumentsPutMulti")
|
||||
public void testPutMultiIsEmpty(MapType mapType, UpdateMode updateMode, Map<String, String> entries, boolean shouldFail) {
|
||||
public void testPutMultiIsEmpty(MapType mapType, UpdateMode updateMode, Object2ObjectSortedMap<String, String> entries, boolean shouldFail) {
|
||||
var remainingEntries = new ConcurrentHashMap<Entry<String, String>, Boolean>().keySet(true);
|
||||
Step<Boolean> stpVer = StepVerifier
|
||||
.create(tempDb(getTempDbGenerator(), allocator, db -> tempDictionary(db, updateMode)
|
||||
@ -716,7 +727,7 @@ public abstract class TestDictionaryMap {
|
||||
|
||||
@ParameterizedTest
|
||||
@MethodSource("provideArgumentsPutMulti")
|
||||
public void testPutMultiClear(MapType mapType, UpdateMode updateMode, Map<String, String> entries, boolean shouldFail) {
|
||||
public void testPutMultiClear(MapType mapType, UpdateMode updateMode, Object2ObjectSortedMap<String, String> entries, boolean shouldFail) {
|
||||
List<Boolean> result;
|
||||
try {
|
||||
result = SyncUtils.run(DbTestUtils.tempDb(getTempDbGenerator(), allocator, db -> tempDictionary(db, updateMode)
|
||||
|
@ -17,6 +17,9 @@ import it.cavallium.dbengine.DbTestUtils.TestAllocator;
|
||||
import it.cavallium.dbengine.database.LLUtils;
|
||||
import it.cavallium.dbengine.database.UpdateMode;
|
||||
import it.cavallium.dbengine.database.collections.DatabaseMapDictionaryDeep;
|
||||
import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap;
|
||||
import it.unimi.dsi.fastutil.objects.Object2ObjectSortedMap;
|
||||
import it.unimi.dsi.fastutil.objects.Object2ObjectSortedMaps;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@ -72,14 +75,14 @@ public abstract class TestDictionaryMapDeep {
|
||||
badKeys.stream().map(s -> Tuples.of(s, true))
|
||||
).collect(Collectors.toSet());
|
||||
var values = Set.of(
|
||||
Map.of("123456", "a", "234567", ""),
|
||||
Map.of("123456", "\0", "234567", "\0\0", "345678", BIG_STRING)
|
||||
new Object2ObjectLinkedOpenHashMap<>(Map.of("123456", "a", "234567", "")),
|
||||
new Object2ObjectLinkedOpenHashMap<>(Map.of("123456", "\0", "234567", "\0\0", "345678", BIG_STRING))
|
||||
);
|
||||
|
||||
return keys
|
||||
.stream()
|
||||
.flatMap(keyTuple -> {
|
||||
Stream<Map<String, String>> strm;
|
||||
Stream<Object2ObjectLinkedOpenHashMap<String, String>> strm;
|
||||
if (keyTuple.getT2()) {
|
||||
strm = values.stream().limit(1);
|
||||
} else {
|
||||
@ -182,7 +185,10 @@ public abstract class TestDictionaryMapDeep {
|
||||
|
||||
@ParameterizedTest
|
||||
@MethodSource("provideArgumentsSet")
|
||||
public void testPutValue(UpdateMode updateMode, String key, Map<String, String> value, boolean shouldFail) {
|
||||
public void testPutValue(UpdateMode updateMode,
|
||||
String key,
|
||||
Object2ObjectSortedMap<String, String> value,
|
||||
boolean shouldFail) {
|
||||
var gen = getTempDbGenerator();
|
||||
var db = run(gen.openTempDb(allocator));
|
||||
var dict = run(tempDictionary(db.db(), updateMode));
|
||||
@ -206,7 +212,10 @@ public abstract class TestDictionaryMapDeep {
|
||||
|
||||
@ParameterizedTest
|
||||
@MethodSource("provideArgumentsSet")
|
||||
public void testGetValue(UpdateMode updateMode, String key, Map<String, String> value, boolean shouldFail) {
|
||||
public void testGetValue(UpdateMode updateMode,
|
||||
String key,
|
||||
Object2ObjectSortedMap<String, String> value,
|
||||
boolean shouldFail) {
|
||||
var gen = getTempDbGenerator();
|
||||
var db = run(gen.openTempDb(allocator));
|
||||
var dict = run(tempDictionary(db.db(), updateMode));
|
||||
@ -229,7 +238,7 @@ public abstract class TestDictionaryMapDeep {
|
||||
|
||||
@ParameterizedTest
|
||||
@MethodSource("provideArgumentsSet")
|
||||
public void testSetValueGetAllValues(UpdateMode updateMode, String key, Map<String, String> value,
|
||||
public void testSetValueGetAllValues(UpdateMode updateMode, String key, Object2ObjectSortedMap<String, String> value,
|
||||
boolean shouldFail) {
|
||||
var stpVer = StepVerifier
|
||||
.create(tempDb(getTempDbGenerator(), allocator, db -> tempDictionary(db, updateMode)
|
||||
@ -250,7 +259,9 @@ public abstract class TestDictionaryMapDeep {
|
||||
|
||||
@ParameterizedTest
|
||||
@MethodSource("provideArgumentsSet")
|
||||
public void testAtSetGetAllStagesGetAllValues(UpdateMode updateMode, String key, Map<String, String> value,
|
||||
public void testAtSetGetAllStagesGetAllValues(UpdateMode updateMode,
|
||||
String key,
|
||||
Object2ObjectSortedMap<String, String> value,
|
||||
boolean shouldFail) {
|
||||
var remainingEntries = new ConcurrentHashMap<Tuple3<String, String, String>, Boolean>().keySet(true);
|
||||
Step<Tuple3<String, String, String>> stpVer = StepVerifier
|
||||
@ -269,7 +280,7 @@ public abstract class TestDictionaryMapDeep {
|
||||
.at(null, "capra")
|
||||
.flatMap(v_ -> Mono.using(
|
||||
() -> v_,
|
||||
v -> v.set(Map.of("normal", "123", "ormaln", "456")),
|
||||
v -> v.set(new Object2ObjectLinkedOpenHashMap<>(Map.of("normal", "123", "ormaln", "456"))),
|
||||
ResourceSupport::close
|
||||
))
|
||||
)
|
||||
@ -332,15 +343,18 @@ public abstract class TestDictionaryMapDeep {
|
||||
|
||||
@ParameterizedTest
|
||||
@MethodSource("provideArgumentsSet")
|
||||
public void testSetAndGetPrevious(UpdateMode updateMode, String key, Map<String, String> value, boolean shouldFail) {
|
||||
public void testSetAndGetPrevious(UpdateMode updateMode,
|
||||
String key,
|
||||
Object2ObjectSortedMap<String, String> value,
|
||||
boolean shouldFail) {
|
||||
var stpVer = StepVerifier
|
||||
.create(tempDb(getTempDbGenerator(), allocator, db -> tempDictionary(db, updateMode)
|
||||
.map(dict -> tempDatabaseMapDictionaryDeepMap(dict, 5, 6))
|
||||
.flatMapMany(map -> Flux
|
||||
.concat
|
||||
(map
|
||||
.putValueAndGetPrevious(key, Map.of("error?", "error."))
|
||||
.defaultIfEmpty(Map.of("nothing", "nothing")),
|
||||
.putValueAndGetPrevious(key, new Object2ObjectLinkedOpenHashMap<>(Map.of("error?", "error.")))
|
||||
.defaultIfEmpty(new Object2ObjectLinkedOpenHashMap<>(Map.of("nothing", "nothing"))),
|
||||
map.putValueAndGetPrevious(key, value),
|
||||
map.putValueAndGetPrevious(key, value)
|
||||
)
|
||||
@ -351,7 +365,12 @@ public abstract class TestDictionaryMapDeep {
|
||||
this.checkLeaks = false;
|
||||
stpVer.verifyError();
|
||||
} else {
|
||||
stpVer.expectNext(Map.of("nothing", "nothing"), Map.of("error?", "error.")).expectNext(value).verifyComplete();
|
||||
stpVer
|
||||
.expectNext(new Object2ObjectLinkedOpenHashMap<>(Map.of("nothing", "nothing")),
|
||||
new Object2ObjectLinkedOpenHashMap<>(Map.of("error?", "error."))
|
||||
)
|
||||
.expectNext(value)
|
||||
.verifyComplete();
|
||||
}
|
||||
}
|
||||
|
||||
@ -396,7 +415,9 @@ public abstract class TestDictionaryMapDeep {
|
||||
|
||||
@ParameterizedTest
|
||||
@MethodSource("provideArgumentsSet")
|
||||
public void testSetValueRemoveAndGetPrevious(UpdateMode updateMode, String key, Map<String, String> value,
|
||||
public void testSetValueRemoveAndGetPrevious(UpdateMode updateMode,
|
||||
String key,
|
||||
Object2ObjectSortedMap<String, String> value,
|
||||
boolean shouldFail) {
|
||||
var stpVer = StepVerifier
|
||||
.create(tempDb(getTempDbGenerator(), allocator, db -> tempDictionary(db, updateMode)
|
||||
@ -460,7 +481,9 @@ public abstract class TestDictionaryMapDeep {
|
||||
|
||||
@ParameterizedTest
|
||||
@MethodSource("provideArgumentsSet")
|
||||
public void testSetValueRemoveAndGetStatus(UpdateMode updateMode, String key, Map<String, String> value,
|
||||
public void testSetValueRemoveAndGetStatus(UpdateMode updateMode,
|
||||
String key,
|
||||
Object2ObjectSortedMap<String, String> value,
|
||||
boolean shouldFail) {
|
||||
var stpVer = StepVerifier
|
||||
.create(tempDb(getTempDbGenerator(), allocator, db -> tempDictionary(db, updateMode)
|
||||
@ -524,7 +547,10 @@ public abstract class TestDictionaryMapDeep {
|
||||
|
||||
@ParameterizedTest
|
||||
@MethodSource("provideArgumentsSet")
|
||||
public void testUpdate(UpdateMode updateMode, String key, Map<String, String> value, boolean shouldFail) {
|
||||
public void testUpdate(UpdateMode updateMode,
|
||||
String key,
|
||||
Object2ObjectSortedMap<String, String> value,
|
||||
boolean shouldFail) {
|
||||
if (updateMode != UpdateMode.ALLOW_UNSAFE && !isTestBadKeysEnabled()) {
|
||||
return;
|
||||
}
|
||||
@ -535,15 +561,15 @@ public abstract class TestDictionaryMapDeep {
|
||||
.concat(
|
||||
map.updateValue(key, old -> {
|
||||
assert old == null;
|
||||
return Map.of("error?", "error.");
|
||||
return new Object2ObjectLinkedOpenHashMap<>(Map.of("error?", "error."));
|
||||
}),
|
||||
map.updateValue(key, false, old -> {
|
||||
assert Objects.equals(old, Map.of("error?", "error."));
|
||||
return Map.of("error?", "error.");
|
||||
return new Object2ObjectLinkedOpenHashMap<>(Map.of("error?", "error."));
|
||||
}),
|
||||
map.updateValue(key, true, old -> {
|
||||
assert Objects.equals(old, Map.of("error?", "error."));
|
||||
return Map.of("error?", "error.");
|
||||
return new Object2ObjectLinkedOpenHashMap<>(Map.of("error?", "error."));
|
||||
}),
|
||||
map.updateValue(key, true, old -> {
|
||||
assert Objects.equals(old, Map.of("error?", "error."));
|
||||
@ -613,7 +639,10 @@ public abstract class TestDictionaryMapDeep {
|
||||
|
||||
@ParameterizedTest
|
||||
@MethodSource("provideArgumentsSet")
|
||||
public void testUpdateGet(UpdateMode updateMode, String key, Map<String, String> value, boolean shouldFail) {
|
||||
public void testUpdateGet(UpdateMode updateMode,
|
||||
String key,
|
||||
Object2ObjectSortedMap<String, String> value,
|
||||
boolean shouldFail) {
|
||||
if (updateMode != UpdateMode.ALLOW_UNSAFE && !isTestBadKeysEnabled()) {
|
||||
return;
|
||||
}
|
||||
@ -622,18 +651,18 @@ public abstract class TestDictionaryMapDeep {
|
||||
.flatMapMany(map -> Flux.concat(
|
||||
map.updateValue(key, old -> {
|
||||
assert old == null;
|
||||
return Map.of("error?", "error.");
|
||||
return new Object2ObjectLinkedOpenHashMap<>(Map.of("error?", "error."));
|
||||
}).then(map.getValue(null, key)),
|
||||
map.updateValue(key, false, old -> {
|
||||
assert Objects.equals(old, Map.of("error?", "error."));
|
||||
return Map.of("error?", "error.");
|
||||
return new Object2ObjectLinkedOpenHashMap<>(Map.of("error?", "error."));
|
||||
}).then(map.getValue(null, key)),
|
||||
map.updateValue(key, true, old -> {
|
||||
assert Objects.equals(old, Map.of("error?", "error."));
|
||||
return Map.of("error?", "error.");
|
||||
return new Object2ObjectLinkedOpenHashMap<>(Map.of("error?", "error."));
|
||||
}).then(map.getValue(null, key)),
|
||||
map.updateValue(key, true, old -> {
|
||||
assert Objects.equals(old, Map.of("error?", "error."));
|
||||
assert Objects.equals(old, new Object2ObjectLinkedOpenHashMap<>(Map.of("error?", "error.")));
|
||||
return value;
|
||||
}).then(map.getValue(null, key)),
|
||||
map.updateValue(key, true, old -> {
|
||||
@ -646,7 +675,12 @@ public abstract class TestDictionaryMapDeep {
|
||||
stpVer.verifyError();
|
||||
} else {
|
||||
stpVer
|
||||
.expectNext(Map.of("error?", "error."), Map.of("error?", "error."), Map.of("error?", "error."), value, value)
|
||||
.expectNext(new Object2ObjectLinkedOpenHashMap<>(Map.of("error?", "error.")),
|
||||
new Object2ObjectLinkedOpenHashMap<>(Map.of("error?", "error.")),
|
||||
new Object2ObjectLinkedOpenHashMap<>(Map.of("error?", "error.")),
|
||||
value,
|
||||
value
|
||||
)
|
||||
.verifyComplete();
|
||||
}
|
||||
}
|
||||
@ -708,17 +742,20 @@ public abstract class TestDictionaryMapDeep {
|
||||
|
||||
@ParameterizedTest
|
||||
@MethodSource("provideArgumentsSet")
|
||||
public void testSetAndGetChanged(UpdateMode updateMode, String key, Map<String, String> value, boolean shouldFail) {
|
||||
public void testSetAndGetChanged(UpdateMode updateMode,
|
||||
String key,
|
||||
Object2ObjectSortedMap<String, String> value,
|
||||
boolean shouldFail) {
|
||||
var stpVer = StepVerifier
|
||||
.create(tempDb(getTempDbGenerator(), allocator, db -> tempDictionary(db, updateMode)
|
||||
.map(dict -> tempDatabaseMapDictionaryDeepMap(dict, 5, 6))
|
||||
.flatMapMany(map -> Flux
|
||||
.concat(
|
||||
map.putValueAndGetChanged(key, Map.of("error?", "error.")).single(),
|
||||
map.putValueAndGetChanged(key, new Object2ObjectLinkedOpenHashMap<>(Map.of("error?", "error."))).single(),
|
||||
map.putValueAndGetChanged(key, value).single(),
|
||||
map.putValueAndGetChanged(key, value).single(),
|
||||
map.remove(key),
|
||||
map.putValueAndGetChanged(key, Map.of("error?", "error.")).single()
|
||||
map.putValueAndGetChanged(key, new Object2ObjectLinkedOpenHashMap<>(Map.of("error?", "error."))).single()
|
||||
)
|
||||
.doFinally(s -> map.close())
|
||||
)
|
||||
@ -739,20 +776,19 @@ public abstract class TestDictionaryMapDeep {
|
||||
} else {
|
||||
badKeys = List.of();
|
||||
}
|
||||
List<Tuple2<List<String>, Boolean>> keys = Stream.concat(
|
||||
goodKeys.stream().map(s -> Tuples.of(s, false)),
|
||||
badKeys.stream().map(s -> Tuples.of(s, true))
|
||||
).collect(Collectors.toList());
|
||||
var values = isCIMode() ? List.of(Map.of("123456", "val")) : List.of(
|
||||
Map.of("123456", "a", "234567", ""),
|
||||
Map.of("123456", "\0", "234567", "\0\0", "345678", BIG_STRING)
|
||||
List<Tuple2<List<String>, Boolean>> keys = Stream
|
||||
.concat(goodKeys.stream().map(s -> Tuples.of(s, false)), badKeys.stream().map(s -> Tuples.of(s, true)))
|
||||
.toList();
|
||||
var values = isCIMode() ? List.of(new Object2ObjectLinkedOpenHashMap<>(Map.of("123456", "val"))) : List.of(
|
||||
new Object2ObjectLinkedOpenHashMap<>(Map.of("123456", "a", "234567", "")),
|
||||
new Object2ObjectLinkedOpenHashMap<>(Map.of("123456", "\0", "234567", "\0\0", "345678", BIG_STRING))
|
||||
);
|
||||
|
||||
return keys
|
||||
.stream()
|
||||
.map(keyTuple -> keyTuple.mapT1(ks -> Flux
|
||||
.zip(Flux.fromIterable(ks), Flux.fromIterable(values))
|
||||
.collectMap(Tuple2::getT1, Tuple2::getT2)
|
||||
.collectMap(Tuple2::getT1, Tuple2::getT2, Object2ObjectLinkedOpenHashMap::new)
|
||||
.block()
|
||||
))
|
||||
.flatMap(entryTuple -> Arrays.stream(UpdateMode.values()).map(updateMode -> Tuples.of(updateMode,
|
||||
@ -764,7 +800,8 @@ public abstract class TestDictionaryMapDeep {
|
||||
|
||||
@ParameterizedTest
|
||||
@MethodSource("provideArgumentsSetMulti")
|
||||
public void testSetMultiGetMulti(UpdateMode updateMode, Map<String, Map<String, String>> entries,
|
||||
public void testSetMultiGetMulti(UpdateMode updateMode,
|
||||
Map<String, Object2ObjectSortedMap<String, String>> entries,
|
||||
boolean shouldFail) {
|
||||
var flux = tempDb(getTempDbGenerator(), allocator, db -> tempDictionary(db, updateMode)
|
||||
.map(dict -> tempDatabaseMapDictionaryDeepMap(dict, 5, 6))
|
||||
@ -793,7 +830,8 @@ public abstract class TestDictionaryMapDeep {
|
||||
|
||||
@ParameterizedTest
|
||||
@MethodSource("provideArgumentsSetMulti")
|
||||
public void testSetAllValuesGetMulti(UpdateMode updateMode, Map<String, Map<String, String>> entries,
|
||||
public void testSetAllValuesGetMulti(UpdateMode updateMode,
|
||||
Object2ObjectSortedMap<String, Object2ObjectSortedMap<String, String>> entries,
|
||||
boolean shouldFail) {
|
||||
var remainingEntries = new ConcurrentHashMap<Entry<String, Map<String, String>>, Boolean>().keySet(true);
|
||||
Step<Entry<String, Map<String, String>>> stpVer = StepVerifier
|
||||
@ -824,10 +862,10 @@ public abstract class TestDictionaryMapDeep {
|
||||
|
||||
@ParameterizedTest
|
||||
@MethodSource("provideArgumentsSetMulti")
|
||||
public void testSetAllValuesAndGetPrevious(UpdateMode updateMode, Map<String, Map<String, String>> entries,
|
||||
public void testSetAllValuesAndGetPrevious(UpdateMode updateMode, Object2ObjectSortedMap<String, Object2ObjectSortedMap<String, String>> entries,
|
||||
boolean shouldFail) {
|
||||
var remainingEntries = new ConcurrentHashMap<Entry<String, Map<String, String>>, Boolean>().keySet(true);
|
||||
Step<Entry<String, Map<String, String>>> stpVer = StepVerifier
|
||||
var remainingEntries = new ConcurrentHashMap<Entry<String, Object2ObjectSortedMap<String, String>>, Boolean>().keySet(true);
|
||||
Step<Entry<String, Object2ObjectSortedMap<String, String>>> stpVer = StepVerifier
|
||||
.create(tempDb(getTempDbGenerator(), allocator, db -> tempDictionary(db, updateMode)
|
||||
.map(dict -> tempDatabaseMapDictionaryDeepMap(dict, 5, 6))
|
||||
.flatMapMany(map -> Flux
|
||||
@ -844,7 +882,7 @@ public abstract class TestDictionaryMapDeep {
|
||||
stpVer.verifyError();
|
||||
} else {
|
||||
entries.forEach((k, v) -> remainingEntries.add(Map.entry(k, v)));
|
||||
for (Entry<String, Map<String, String>> ignored : remainingEntries) {
|
||||
for (Entry<String, Object2ObjectSortedMap<String, String>> ignored : remainingEntries) {
|
||||
stpVer = stpVer.expectNextMatches(remainingEntries::remove);
|
||||
}
|
||||
stpVer.verifyComplete();
|
||||
@ -853,9 +891,9 @@ public abstract class TestDictionaryMapDeep {
|
||||
|
||||
@ParameterizedTest
|
||||
@MethodSource("provideArgumentsSetMulti")
|
||||
public void testSetGetMulti(UpdateMode updateMode, Map<String, Map<String, String>> entries, boolean shouldFail) {
|
||||
var remainingEntries = new ConcurrentHashMap<Entry<String, Map<String, String>>, Boolean>().keySet(true);
|
||||
Step<Entry<String, Map<String, String>>> stpVer = StepVerifier
|
||||
public void testSetGetMulti(UpdateMode updateMode, Object2ObjectSortedMap<String, Object2ObjectSortedMap<String, String>> entries, boolean shouldFail) {
|
||||
var remainingEntries = new ConcurrentHashMap<Entry<String, Object2ObjectSortedMap<String, String>>, Boolean>().keySet(true);
|
||||
Step<Entry<String, Object2ObjectSortedMap<String, String>>> stpVer = StepVerifier
|
||||
.create(tempDb(getTempDbGenerator(), allocator, db -> tempDictionary(db, updateMode)
|
||||
.map(dict -> tempDatabaseMapDictionaryDeepMap(dict, 5, 6))
|
||||
.flatMapMany(map -> {
|
||||
@ -877,7 +915,7 @@ public abstract class TestDictionaryMapDeep {
|
||||
stpVer.verifyError();
|
||||
} else {
|
||||
entries.forEach((k, v) -> remainingEntries.add(Map.entry(k, v)));
|
||||
for (Entry<String, Map<String, String>> ignored : remainingEntries) {
|
||||
for (Entry<String, Object2ObjectSortedMap<String, String>> ignored : remainingEntries) {
|
||||
stpVer = stpVer.expectNextMatches(remainingEntries::remove);
|
||||
}
|
||||
stpVer.verifyComplete();
|
||||
@ -886,7 +924,7 @@ public abstract class TestDictionaryMapDeep {
|
||||
|
||||
@ParameterizedTest
|
||||
@MethodSource("provideArgumentsSetMulti")
|
||||
public void testSetAndGetStatus(UpdateMode updateMode, Map<String, Map<String, String>> entries,
|
||||
public void testSetAndGetStatus(UpdateMode updateMode, Object2ObjectSortedMap<String, Object2ObjectSortedMap<String, String>> entries,
|
||||
boolean shouldFail) {
|
||||
Step<Boolean> stpVer = StepVerifier
|
||||
.create(tempDb(getTempDbGenerator(), allocator, db -> tempDictionary(db, updateMode)
|
||||
@ -919,10 +957,10 @@ public abstract class TestDictionaryMapDeep {
|
||||
|
||||
@ParameterizedTest
|
||||
@MethodSource("provideArgumentsSetMulti")
|
||||
public void testSetAndGetPrevious(UpdateMode updateMode, Map<String, Map<String, String>> entries,
|
||||
public void testSetAndGetPrevious(UpdateMode updateMode, Object2ObjectSortedMap<String, Object2ObjectSortedMap<String, String>> entries,
|
||||
boolean shouldFail) {
|
||||
var remainingEntries = new ConcurrentHashMap<Entry<String, Map<String, String>>, Boolean>().keySet(true);
|
||||
Step<Entry<String, Map<String, String>>> stpVer = StepVerifier
|
||||
var remainingEntries = new ConcurrentHashMap<Entry<String, Object2ObjectSortedMap<String, String>>, Boolean>().keySet(true);
|
||||
Step<Entry<String, Object2ObjectSortedMap<String, String>>> stpVer = StepVerifier
|
||||
.create(tempDb(getTempDbGenerator(), allocator, db -> tempDictionary(db, updateMode)
|
||||
.map(dict -> tempDatabaseMapDictionaryDeepMap(dict, 5, 6))
|
||||
.flatMapMany(map -> Flux
|
||||
@ -940,7 +978,7 @@ public abstract class TestDictionaryMapDeep {
|
||||
stpVer.verifyError();
|
||||
} else {
|
||||
entries.forEach((k, v) -> remainingEntries.add(Map.entry(k, v)));
|
||||
for (Entry<String, Map<String, String>> ignored : remainingEntries) {
|
||||
for (Entry<String, Object2ObjectSortedMap<String, String>> ignored : remainingEntries) {
|
||||
stpVer = stpVer.expectNextMatches(remainingEntries::remove);
|
||||
}
|
||||
stpVer.verifyComplete();
|
||||
@ -949,10 +987,10 @@ public abstract class TestDictionaryMapDeep {
|
||||
|
||||
@ParameterizedTest
|
||||
@MethodSource("provideArgumentsSetMulti")
|
||||
public void testSetClearAndGetPreviousGet(UpdateMode updateMode, Map<String, Map<String, String>> entries,
|
||||
public void testSetClearAndGetPreviousGet(UpdateMode updateMode, Object2ObjectSortedMap<String, Object2ObjectSortedMap<String, String>> entries,
|
||||
boolean shouldFail) {
|
||||
var remainingEntries = new ConcurrentHashMap<Entry<String, Map<String, String>>, Boolean>().keySet(true);
|
||||
Step<Entry<String, Map<String, String>>> stpVer = StepVerifier
|
||||
var remainingEntries = new ConcurrentHashMap<Entry<String, Object2ObjectSortedMap<String, String>>, Boolean>().keySet(true);
|
||||
Step<Entry<String, Object2ObjectSortedMap<String, String>>> stpVer = StepVerifier
|
||||
.create(tempDb(getTempDbGenerator(), allocator, db -> tempDictionary(db, updateMode)
|
||||
.map(dict -> tempDatabaseMapDictionaryDeepMap(dict, 5, 6))
|
||||
.flatMapMany(map -> Flux
|
||||
@ -968,7 +1006,7 @@ public abstract class TestDictionaryMapDeep {
|
||||
stpVer.verifyError();
|
||||
} else {
|
||||
entries.forEach((k, v) -> remainingEntries.add(Map.entry(k, v)));
|
||||
for (Entry<String, Map<String, String>> ignored : remainingEntries) {
|
||||
for (Entry<String, Object2ObjectSortedMap<String, String>> ignored : remainingEntries) {
|
||||
stpVer = stpVer.expectNextMatches(remainingEntries::remove);
|
||||
}
|
||||
stpVer.verifyComplete();
|
||||
@ -977,10 +1015,10 @@ public abstract class TestDictionaryMapDeep {
|
||||
|
||||
@ParameterizedTest
|
||||
@MethodSource("provideArgumentsSetMulti")
|
||||
public void testSetMultiGetAllValues(UpdateMode updateMode, Map<String, Map<String, String>> entries,
|
||||
public void testSetMultiGetAllValues(UpdateMode updateMode, Object2ObjectSortedMap<String, Object2ObjectSortedMap<String, String>> entries,
|
||||
boolean shouldFail) {
|
||||
var remainingEntries = new ConcurrentHashMap<Entry<String, Map<String, String>>, Boolean>().keySet(true);
|
||||
Step<Entry<String, Map<String, String>>> stpVer = StepVerifier
|
||||
var remainingEntries = new ConcurrentHashMap<Entry<String, Object2ObjectSortedMap<String, String>>, Boolean>().keySet(true);
|
||||
Step<Entry<String, Object2ObjectSortedMap<String, String>>> stpVer = StepVerifier
|
||||
.create(tempDb(getTempDbGenerator(), allocator, db -> tempDictionary(db, updateMode)
|
||||
.map(dict -> tempDatabaseMapDictionaryDeepMap(dict, 5, 6))
|
||||
.flatMapMany(map -> Flux
|
||||
@ -996,7 +1034,7 @@ public abstract class TestDictionaryMapDeep {
|
||||
stpVer.verifyError();
|
||||
} else {
|
||||
entries.forEach((k, v) -> remainingEntries.add(Map.entry(k, v)));
|
||||
for (Entry<String, Map<String, String>> ignored : remainingEntries) {
|
||||
for (Entry<String, Object2ObjectSortedMap<String, String>> ignored : remainingEntries) {
|
||||
stpVer = stpVer.expectNextMatches(remainingEntries::remove);
|
||||
}
|
||||
stpVer.verifyComplete();
|
||||
@ -1005,9 +1043,9 @@ public abstract class TestDictionaryMapDeep {
|
||||
|
||||
@ParameterizedTest
|
||||
@MethodSource("provideArgumentsSetMulti")
|
||||
public void testSetMultiGet(UpdateMode updateMode, Map<String, Map<String, String>> entries, boolean shouldFail) {
|
||||
var remainingEntries = new ConcurrentHashMap<Entry<String, Map<String, String>>, Boolean>().keySet(true);
|
||||
Step<Entry<String, Map<String, String>>> stpVer = StepVerifier
|
||||
public void testSetMultiGet(UpdateMode updateMode, Object2ObjectSortedMap<String, Object2ObjectSortedMap<String, String>> entries, boolean shouldFail) {
|
||||
var remainingEntries = new ConcurrentHashMap<Entry<String, Object2ObjectSortedMap<String, String>>, Boolean>().keySet(true);
|
||||
Step<Entry<String, Object2ObjectSortedMap<String, String>>> stpVer = StepVerifier
|
||||
.create(tempDb(getTempDbGenerator(), allocator, db -> tempDictionary(db, updateMode)
|
||||
.map(dict -> tempDatabaseMapDictionaryDeepMap(dict, 5, 6))
|
||||
.flatMapMany(map -> Flux
|
||||
@ -1025,7 +1063,7 @@ public abstract class TestDictionaryMapDeep {
|
||||
stpVer.verifyError();
|
||||
} else {
|
||||
entries.forEach((k, v) -> remainingEntries.add(Map.entry(k, v)));
|
||||
for (Entry<String, Map<String, String>> ignored : remainingEntries) {
|
||||
for (Entry<String, Object2ObjectSortedMap<String, String>> ignored : remainingEntries) {
|
||||
stpVer = stpVer.expectNextMatches(remainingEntries::remove);
|
||||
}
|
||||
stpVer.verifyComplete();
|
||||
@ -1034,10 +1072,10 @@ public abstract class TestDictionaryMapDeep {
|
||||
|
||||
@ParameterizedTest
|
||||
@MethodSource("provideArgumentsSetMulti")
|
||||
public void testSetMultiGetAllStagesGet(UpdateMode updateMode, Map<String, Map<String, String>> entries,
|
||||
public void testSetMultiGetAllStagesGet(UpdateMode updateMode, Object2ObjectSortedMap<String, Object2ObjectSortedMap<String, String>> entries,
|
||||
boolean shouldFail) {
|
||||
var remainingEntries = new ConcurrentHashMap<Entry<String, Map<String, String>>, Boolean>().keySet(true);
|
||||
Step<Entry<String, Map<String, String>>> stpVer = StepVerifier
|
||||
var remainingEntries = new ConcurrentHashMap<Entry<String, Object2ObjectSortedMap<String, String>>, Boolean>().keySet(true);
|
||||
Step<Entry<String, Object2ObjectSortedMap<String, String>>> stpVer = StepVerifier
|
||||
.create(tempDb(getTempDbGenerator(), allocator, db -> tempDictionary(db, updateMode)
|
||||
.map(dict -> tempDatabaseMapDictionaryDeepMap(dict, 5, 6))
|
||||
.flatMapMany(map -> Flux
|
||||
@ -1060,7 +1098,7 @@ public abstract class TestDictionaryMapDeep {
|
||||
stpVer.verifyError();
|
||||
} else {
|
||||
entries.forEach((k, v) -> remainingEntries.add(Map.entry(k, v)));
|
||||
for (Entry<String, Map<String, String>> ignored : remainingEntries) {
|
||||
for (Entry<String, Object2ObjectSortedMap<String, String>> ignored : remainingEntries) {
|
||||
stpVer = stpVer.expectNextMatches(remainingEntries::remove);
|
||||
}
|
||||
stpVer.verifyComplete();
|
||||
@ -1069,7 +1107,7 @@ public abstract class TestDictionaryMapDeep {
|
||||
|
||||
@ParameterizedTest
|
||||
@MethodSource("provideArgumentsSetMulti")
|
||||
public void testSetMultiIsEmpty(UpdateMode updateMode, Map<String, Map<String, String>> entries,
|
||||
public void testSetMultiIsEmpty(UpdateMode updateMode, Object2ObjectSortedMap<String, Object2ObjectSortedMap<String, String>> entries,
|
||||
boolean shouldFail) {
|
||||
Step<Boolean> stpVer = StepVerifier
|
||||
.create(tempDb(getTempDbGenerator(), allocator, db -> tempDictionary(db, updateMode)
|
||||
@ -1094,7 +1132,7 @@ public abstract class TestDictionaryMapDeep {
|
||||
|
||||
@ParameterizedTest
|
||||
@MethodSource("provideArgumentsSetMulti")
|
||||
public void testSetMultiClear(UpdateMode updateMode, Map<String, Map<String, String>> entries, boolean shouldFail) {
|
||||
public void testSetMultiClear(UpdateMode updateMode, Object2ObjectSortedMap<String, Object2ObjectSortedMap<String, String>> entries, boolean shouldFail) {
|
||||
Step<Boolean> stpVer = StepVerifier
|
||||
.create(tempDb(getTempDbGenerator(), allocator, db -> tempDictionary(db, updateMode)
|
||||
.map(dict -> tempDatabaseMapDictionaryDeepMap(dict, 5, 6))
|
||||
|
Loading…
Reference in New Issue
Block a user