swaydb.eventually.persistent.Set Maven / Gradle / Ivy
/*
* Copyright (c) 2019 Simer Plaha (@simerplaha)
*
* This file is a part of SwayDB.
*
* SwayDB is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* SwayDB is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with SwayDB. If not, see .
*/
package swaydb.eventually.persistent;
import java.io.Closeable;
import java.nio.file.Path;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.TimeUnit;
import scala.Function1;
import scala.Option;
import scala.collection.Iterable;
import scala.collection.JavaConverters;
import scala.collection.Seq;
import scala.collection.mutable.Buffer;
import scala.concurrent.duration.Deadline;
import scala.concurrent.duration.FiniteDuration;
import swaydb.Prepare;
import swaydb.data.IO;
import swaydb.data.accelerate.Level0Meter;
import swaydb.data.compaction.LevelMeter;
import swaydb.java.Serializer;
public class Set implements swaydb.java.Set, Closeable {
private final swaydb.Set database;
private Set(swaydb.Set database) {
this.database = database;
}
@Override
public boolean contains(K elem) {
return (boolean) database.contains(elem).get();
}
@Override
public boolean mightContain(K key) {
return (boolean) database.mightContain(key).get();
}
@Override
public Iterator iterator() {
Seq entries = database.asScala().toSeq();
java.util.List result = new ArrayList<>();
for (int index = 0; index < entries.size(); index += 1) {
result.add(entries.apply(index));
}
return result.iterator();
}
@Override
public Object[] toArray() {
Seq entries = database.asScala().toSeq();
java.util.List result = new ArrayList<>();
for (int index = 0; index < entries.size(); index += 1) {
result.add(entries.apply(index));
}
return result.toArray();
}
@SuppressWarnings("unchecked")
@Override
public T[] toArray(T[] a) {
return (T[]) toArray();
}
@Override
public boolean add(K key) {
Object result = database.add(key).get();
return result instanceof scala.Some;
}
@SuppressWarnings("unchecked")
@Override
public boolean add(K key, long expireAfter, TimeUnit timeUnit) {
boolean result = contains(key);
database.add(key, FiniteDuration.create(expireAfter, timeUnit)).get();
return result;
}
@SuppressWarnings("unchecked")
@Override
public boolean add(K key, LocalDateTime expireAt) {
boolean result = contains(key);
int expireAtNano = Duration.between(LocalDateTime.now(), expireAt).getNano();
database.add(key, FiniteDuration.create(expireAtNano, TimeUnit.NANOSECONDS).fromNow()).get();
return result;
}
@SuppressWarnings("unchecked")
@Override
public boolean expire(K key, long after, TimeUnit timeUnit) {
boolean result = contains(key);
database.expire(key, FiniteDuration.create(after, timeUnit)).get();
return result;
}
@SuppressWarnings("unchecked")
@Override
public boolean expire(K key, LocalDateTime expireAt) {
boolean result = contains(key);
int expireAtNano = Duration.between(LocalDateTime.now(), expireAt).getNano();
database.expire(key, FiniteDuration.create(expireAtNano, TimeUnit.NANOSECONDS).fromNow()).get();
return result;
}
@SuppressWarnings("unchecked")
@Override
public boolean containsAll(Collection collection) {
return collection.stream()
.allMatch(elem -> (boolean) database.contains(elem).get());
}
@Override
public boolean add(List extends K> list) {
Buffer extends K> entries = scala.collection.JavaConverters.asScalaBufferConverter(list).asScala();
database.add(entries.toSet()).get();
return true;
}
@SuppressWarnings("unchecked")
@Override
public boolean retainAll(Collection collection) {
Seq entries = database.asScala().toSeq();
java.util.List result = new ArrayList<>();
for (int index = 0; index < entries.size(); index += 1) {
result.add(entries.apply(index));
}
result.stream()
.filter(elem -> !collection.contains(elem))
.forEach(database::remove);
return true;
}
@Override
public void remove(java.util.Set keys) {
database.remove(scala.collection.JavaConverters.asScalaSetConverter(keys).asScala()).get();
}
@Override
public void remove(K from, K to) {
database.remove(from, to).get();
}
@SuppressWarnings("unchecked")
@Override
public int size() {
return database.asScala().size();
}
@Override
public boolean isEmpty() {
return (boolean) database.isEmpty().get();
}
@Override
public boolean nonEmpty() {
return (boolean) database.nonEmpty().get();
}
@Override
public LocalDateTime expiration(K key) {
Object result = database.expiration(key).get();
if (result instanceof scala.Some) {
Deadline expiration = (Deadline) ((scala.Some) result).get();
return LocalDateTime.now().plusNanos(expiration.timeLeft().toNanos());
}
return null;
}
@Override
public Duration timeLeft(K key) {
Object result = database.timeLeft(key).get();
if (result instanceof scala.Some) {
FiniteDuration duration = (FiniteDuration) ((scala.Some) result).get();
return Duration.ofNanos(duration.toNanos());
}
return null;
}
@Override
public long sizeOfSegments() {
return database.sizeOfSegments();
}
@Override
public Level0Meter level0Meter() {
return database.level0Meter();
}
public Optional level1Meter() {
return levelMeter(1);
}
@Override
public Optional levelMeter(int levelNumber) {
Option levelMeter = database.levelMeter(levelNumber);
return levelMeter.isEmpty() ? Optional.empty() : Optional.ofNullable(levelMeter.get());
}
@Override
public void clear() {
database.asScala().clear();
}
@Override
public boolean remove(K key) {
Object result = database.remove(key).get();
return result instanceof scala.Some;
}
@Override
public java.util.Set asJava() {
return JavaConverters.setAsJavaSetConverter(database.asScala()).asJava();
}
@Override
public void close() {
database.closeDatabase().get();
}
@SuppressWarnings("unchecked")
@Override
public Level0Meter commit(Prepare... prepares) {
List> preparesList = Arrays.asList(prepares);
Iterable> prepareIterator
= JavaConverters.iterableAsScalaIterableConverter(preparesList).asScala();
return (Level0Meter) database.commit(prepareIterator).get();
}
@SuppressWarnings("unchecked")
public static swaydb.eventually.persistent.Set create(Object keySerializer, Path dir) {
int maxOpenSegments = swaydb.persistent.Map$.MODULE$.apply$default$2();
int cacheSize = swaydb.persistent.Map$.MODULE$.apply$default$3();
int mapSize = swaydb.persistent.Map$.MODULE$.apply$default$4();
boolean mmapMaps = swaydb.persistent.Map$.MODULE$.apply$default$5();
swaydb.data.config.RecoveryMode recoveryMode = swaydb.persistent.Map$.MODULE$.apply$default$6();
boolean mmapAppendix = swaydb.persistent.Map$.MODULE$.apply$default$7();
swaydb.data.config.MMAP mmapSegments = swaydb.persistent.Map$.MODULE$.apply$default$8();
int segmentSize = swaydb.persistent.Map$.MODULE$.apply$default$9();
int appendixFlushCheckpointSize = swaydb.persistent.Map$.MODULE$.apply$default$10();
Seq otherDirs = swaydb.persistent.Map$.MODULE$.apply$default$11();
FiniteDuration cacheCheckDelay = swaydb.persistent.Map$.MODULE$.apply$default$12();
FiniteDuration segmentsOpenCheckDelay = swaydb.persistent.Map$.MODULE$.apply$default$13();
double bloomFilterFalsePositiveRate = swaydb.persistent.Map$.MODULE$.apply$default$14();
boolean compressDuplicateValues = swaydb.persistent.Map$.MODULE$.apply$default$15();
boolean deleteSegmentsEventually = swaydb.persistent.Map$.MODULE$.apply$default$16();
Option lastLevelGroupingStrategy = swaydb.persistent.Map$.MODULE$.apply$default$17();
Function1 acceleration = swaydb.persistent.Map$.MODULE$.apply$default$18();
swaydb.data.order.KeyOrder keyOrder = swaydb.persistent.Map$.MODULE$.apply$default$21(dir,
maxOpenSegments, cacheSize, mapSize, mmapMaps, recoveryMode,
mmapAppendix, mmapSegments, segmentSize, appendixFlushCheckpointSize, otherDirs,
cacheCheckDelay, segmentsOpenCheckDelay,
bloomFilterFalsePositiveRate, compressDuplicateValues, deleteSegmentsEventually,
lastLevelGroupingStrategy, acceleration);
scala.concurrent.ExecutionContext ec = swaydb.persistent.Map$.MODULE$.apply$default$22(dir,
maxOpenSegments, cacheSize, mapSize, mmapMaps,
recoveryMode, mmapAppendix, mmapSegments, segmentSize, appendixFlushCheckpointSize,
otherDirs, cacheCheckDelay, segmentsOpenCheckDelay,
bloomFilterFalsePositiveRate, compressDuplicateValues, deleteSegmentsEventually,
lastLevelGroupingStrategy, acceleration);
return new swaydb.eventually.persistent.Set<>(
(swaydb.Set) swaydb.persistent.Set$.MODULE$.apply(dir,
maxOpenSegments, cacheSize, mapSize, mmapMaps, recoveryMode,
mmapAppendix, mmapSegments, segmentSize, appendixFlushCheckpointSize, otherDirs,
cacheCheckDelay, segmentsOpenCheckDelay,
bloomFilterFalsePositiveRate, compressDuplicateValues, deleteSegmentsEventually,
lastLevelGroupingStrategy, acceleration, Serializer.classToType(keySerializer),
keyOrder, ec).get());
}
public static class Builder {
private Path dir;
private int maxOpenSegments = swaydb.persistent.Map$.MODULE$.apply$default$2();
private int cacheSize = swaydb.persistent.Map$.MODULE$.apply$default$3();
private int mapSize = swaydb.persistent.Map$.MODULE$.apply$default$4();
private boolean mmapMaps = swaydb.persistent.Map$.MODULE$.apply$default$5();
private swaydb.data.config.RecoveryMode recoveryMode = swaydb.persistent.Map$.MODULE$.apply$default$6();
private boolean mmapAppendix = swaydb.persistent.Map$.MODULE$.apply$default$7();
private swaydb.data.config.MMAP mmapSegments = swaydb.persistent.Map$.MODULE$.apply$default$8();
private int segmentSize = swaydb.persistent.Map$.MODULE$.apply$default$9();
private int appendixFlushCheckpointSize = swaydb.persistent.Map$.MODULE$.apply$default$10();
private Seq otherDirs = swaydb.persistent.Map$.MODULE$.apply$default$11();
private FiniteDuration cacheCheckDelay = swaydb.persistent.Map$.MODULE$.apply$default$12();
private FiniteDuration segmentsOpenCheckDelay = swaydb.persistent.Map$.MODULE$.apply$default$13();
private double bloomFilterFalsePositiveRate = swaydb.persistent.Map$.MODULE$.apply$default$14();
private boolean compressDuplicateValues = swaydb.persistent.Map$.MODULE$.apply$default$15();
private boolean deleteSegmentsEventually = swaydb.persistent.Map$.MODULE$.apply$default$16();
private Option lastLevelGroupingStrategy = swaydb.persistent.Map$.MODULE$.apply$default$17();
private Function1 acceleration = swaydb.persistent.Map$.MODULE$.apply$default$18();
private Object keySerializer;
public Builder withDir(Path dir) {
this.dir = dir;
return this;
}
public Builder withMaxOpenSegments(int maxOpenSegments) {
this.maxOpenSegments = maxOpenSegments;
return this;
}
public Builder withCacheSize(int cacheSize) {
this.cacheSize = cacheSize;
return this;
}
public Builder withMapSize(int mapSize) {
this.mapSize = mapSize;
return this;
}
public Builder withMmapMaps(boolean mmapMaps) {
this.mmapMaps = mmapMaps;
return this;
}
public Builder withRecoveryMode(swaydb.data.config.RecoveryMode recoveryMode) {
this.recoveryMode = recoveryMode;
return this;
}
public Builder withMmapAppendix(boolean mmapAppendix) {
this.mmapAppendix = mmapAppendix;
return this;
}
public Builder withMmapSegments(swaydb.data.config.MMAP mmapSegments) {
this.mmapSegments = mmapSegments;
return this;
}
public Builder withSegmentSize(int segmentSize) {
this.segmentSize = segmentSize;
return this;
}
public Builder withAppendixFlushCheckpointSize(int appendixFlushCheckpointSize) {
this.appendixFlushCheckpointSize = appendixFlushCheckpointSize;
return this;
}
public Builder withOtherDirs(Seq otherDirs) {
this.otherDirs = otherDirs;
return this;
}
public Builder withCacheCheckDelay(FiniteDuration cacheCheckDelay) {
this.cacheCheckDelay = cacheCheckDelay;
return this;
}
public Builder withSegmentsOpenCheckDelay(FiniteDuration segmentsOpenCheckDelay) {
this.segmentsOpenCheckDelay = segmentsOpenCheckDelay;
return this;
}
public Builder withBloomFilterFalsePositiveRate(double bloomFilterFalsePositiveRate) {
this.bloomFilterFalsePositiveRate = bloomFilterFalsePositiveRate;
return this;
}
public Builder withCompressDuplicateValues(boolean compressDuplicateValues) {
this.compressDuplicateValues = compressDuplicateValues;
return this;
}
public Builder withDeleteSegmentsEventually(boolean deleteSegmentsEventually) {
this.deleteSegmentsEventually = deleteSegmentsEventually;
return this;
}
public Builder withLastLevelGroupingStrategy(Option lastLevelGroupingStrategy) {
this.lastLevelGroupingStrategy = lastLevelGroupingStrategy;
return this;
}
public Builder withAcceleration(Function1 acceleration) {
this.acceleration = acceleration;
return this;
}
public Builder withKeySerializer(Object keySerializer) {
this.keySerializer = keySerializer;
return this;
}
@SuppressWarnings("unchecked")
public swaydb.eventually.persistent.Set build() {
swaydb.data.order.KeyOrder keyOrder = swaydb.persistent.Map$.MODULE$.apply$default$21(dir,
maxOpenSegments, cacheSize, mapSize, mmapMaps, recoveryMode,
mmapAppendix, mmapSegments, segmentSize, appendixFlushCheckpointSize, otherDirs,
cacheCheckDelay, segmentsOpenCheckDelay,
bloomFilterFalsePositiveRate, compressDuplicateValues, deleteSegmentsEventually,
lastLevelGroupingStrategy, acceleration);
scala.concurrent.ExecutionContext ec = swaydb.persistent.Map$.MODULE$.apply$default$22(dir,
maxOpenSegments, cacheSize, mapSize, mmapMaps,
recoveryMode, mmapAppendix, mmapSegments, segmentSize, appendixFlushCheckpointSize,
otherDirs, cacheCheckDelay, segmentsOpenCheckDelay,
bloomFilterFalsePositiveRate, compressDuplicateValues, deleteSegmentsEventually,
lastLevelGroupingStrategy, acceleration);
return new swaydb.eventually.persistent.Set<>(
(swaydb.Set) swaydb.persistent.Set$.MODULE$.apply(dir,
maxOpenSegments, cacheSize, mapSize, mmapMaps, recoveryMode,
mmapAppendix, mmapSegments, segmentSize, appendixFlushCheckpointSize, otherDirs,
cacheCheckDelay, segmentsOpenCheckDelay,
bloomFilterFalsePositiveRate, compressDuplicateValues, deleteSegmentsEventually,
lastLevelGroupingStrategy, acceleration, Serializer.classToType(keySerializer),
keyOrder, ec).get());
}
}
public static Builder builder() {
return new Builder<>();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy