swaydb.memory.Map 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.memory;
import java.io.Closeable;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.AbstractMap;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
import scala.Function1;
import scala.Option;
import scala.Tuple2;
import scala.collection.Iterable;
import scala.collection.JavaConverters;
import scala.collection.Seq;
import scala.concurrent.ExecutionContext;
import scala.concurrent.duration.Deadline;
import scala.concurrent.duration.FiniteDuration;
import scala.runtime.AbstractFunction1;
import scala.runtime.BoxedUnit;
import swaydb.Apply;
import swaydb.Prepare;
import swaydb.Stream;
import swaydb.data.IO;
import swaydb.data.accelerate.Accelerator;
import swaydb.data.accelerate.Level0Meter;
import swaydb.data.api.grouping.KeyValueGroupingStrategy;
import swaydb.data.compaction.LevelMeter;
import swaydb.java.Serializer;
public class Map implements swaydb.java.Map, Closeable {
private final swaydb.Map database;
private Map(swaydb.Map database) {
this.database = database;
}
@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 int keySize(K key) {
return database.keySize(key);
}
@Override
public int valueSize(V value) {
return database.valueSize(value);
}
@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 boolean containsKey(K key) {
return (boolean) database.contains(key).get();
}
@SuppressWarnings("unchecked")
@Override
public boolean mightContain(K key) {
return (boolean) database.mightContain(key).get();
}
@SuppressWarnings("unchecked")
@Override
public java.util.Map.Entry head() {
Object result = database.headOption().get();
if (result instanceof scala.Some) {
scala.Tuple2 tuple2 = (scala.Tuple2) ((scala.Some) result).get();
return new AbstractMap.SimpleEntry<>(tuple2._1(), tuple2._2());
}
return null;
}
@SuppressWarnings("unchecked")
@Override
public Optional> headOption() {
return Optional.ofNullable(head());
}
@SuppressWarnings("unchecked")
@Override
public java.util.Map.Entry last() {
Object result = database.lastOption().get();
if (result instanceof scala.Some) {
scala.Tuple2 tuple2 = (scala.Tuple2) ((scala.Some) result).get();
return new AbstractMap.SimpleEntry<>(tuple2._1(), tuple2._2());
}
return null;
}
@Override
public Optional> lastOption() {
return Optional.ofNullable(last());
}
@Override
public boolean containsValue(V value) {
return values().contains(value);
}
@Override
public void put(java.util.Map map) {
scala.collection.mutable.Map entries =
scala.collection.JavaConverters.mapAsScalaMapConverter(map).asScala();
database.put(entries.toSet()).get();
}
@SuppressWarnings("unchecked")
@Override
public void put(scala.collection.mutable.Seq seq) {
database.put(seq);
}
@Override
public void update(java.util.Map map) {
scala.collection.mutable.Map entries =
scala.collection.JavaConverters.mapAsScalaMapConverter(map).asScala();
database.update(entries.toSet()).get();
}
@Override
public void clear() {
database.asScala().clear();
}
@Override
public Set keySet() {
Seq> entries = database.asScala().toSeq();
Set result = new LinkedHashSet<>();
for (int index = 0; index < entries.size(); index += 1) {
Tuple2 tuple2 = entries.apply(index);
result.add(tuple2._1());
}
return result;
}
@SuppressWarnings("unchecked")
@Override
public K keysHead() {
Object result = database.keys().headOption().get();
if (result instanceof scala.Some) {
return (K) ((scala.Some) result).get();
}
return null;
}
@Override
public Optional keysHeadOption() {
return Optional.ofNullable(keysHead());
}
@SuppressWarnings("unchecked")
@Override
public K keysLast() {
Object result = database.keys().lastOption().get();
if (result instanceof scala.Some) {
return (K) ((scala.Some) result).get();
}
return null;
}
@Override
public Optional keysLastOption() {
return Optional.ofNullable(keysLast());
}
@Override
public List values() {
Seq> entries = database.asScala().toSeq();
List result = new ArrayList<>();
for (int index = 0; index < entries.size(); index += 1) {
Tuple2 tuple2 = entries.apply(index);
result.add(tuple2._2());
}
return result;
}
@SuppressWarnings("unchecked")
@Override
public Set> entrySet() {
Seq> entries = database.asScala().toSeq();
Set> result = new LinkedHashSet<>();
for (int index = 0; index < entries.size(); index += 1) {
Tuple2 tuple2 = entries.apply(index);
result.add(new AbstractMap.SimpleEntry<>(tuple2._1(), tuple2._2()));
}
return result;
}
@Override
public V put(K key, V value) {
V oldValue = get(key);
database.put(key, value).get();
return oldValue;
}
@Override
public V put(K key, V value, long expireAfter, TimeUnit timeUnit) {
V oldValue = get(key);
database.put(key, value, FiniteDuration.create(expireAfter, timeUnit)).get();
return oldValue;
}
@Override
public V put(K key, V value, LocalDateTime expireAt) {
V oldValue = get(key);
int expireAtNano = Duration.between(LocalDateTime.now(), expireAt).getNano();
database.put(key, value, FiniteDuration.create(expireAtNano, TimeUnit.NANOSECONDS).fromNow()).get();
return oldValue;
}
@Override
public V expire(K key, long after, TimeUnit timeUnit) {
V oldValue = get(key);
database.expire(key, FiniteDuration.create(after, timeUnit)).get();
return oldValue;
}
@Override
public V expire(K key, LocalDateTime expireAt) {
V oldValue = get(key);
int expireAtNano = Duration.between(LocalDateTime.now(), expireAt).getNano();
database.expire(key, FiniteDuration.create(expireAtNano, TimeUnit.NANOSECONDS).fromNow()).get();
return oldValue;
}
@Override
public V update(K key, V value) {
V oldValue = get(key);
database.update(key, value).get();
return oldValue;
}
@SuppressWarnings("unchecked")
@Override
public V get(K key) {
Object result = database.get(key).get();
if (result instanceof scala.Some) {
return (V) ((scala.Some) result).get();
}
return null;
}
@Override
public V remove(K key) {
V oldValue = get(key);
database.remove(key).get();
return oldValue;
}
@Override
public void remove(Set keys) {
database.remove(scala.collection.JavaConverters.asScalaSetConverter(keys).asScala()).get();
}
@Override
public void remove(K from, K to) {
database.remove(from, to).get();
}
@Override
public java.util.Map asJava() {
return JavaConverters.mapAsJavaMapConverter(database.asScala()).asJava();
}
@Override
public K registerFunction(K functionId, Function> function) {
return database.registerFunction(functionId, new AbstractFunction1>() {
@Override
public Apply.Map apply(V value) {
return function.apply(value);
}
});
}
@Override
public void applyFunction(K key, K functionId) {
database.applyFunction(key, functionId);
}
@Override
public swaydb.Map from(K key) {
return database.from(key);
}
@Override
public swaydb.Map fromOrAfter(K key) {
return database.fromOrAfter(key);
}
@Override
public swaydb.Map fromOrBefore(K key) {
return database.fromOrBefore(key);
}
@Override
public swaydb.Set keys() {
return database.keys();
}
@Override
public swaydb.Map reverse() {
return database.reverse();
}
@Override
public Stream © 2015 - 2025 Weber Informatics LLC | Privacy Policy