/**
* This file is part of d:swarm graph extension.
*
* d:swarm graph extension is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* d:swarm graph extension 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with d:swarm graph extension. If not, see <http://www.gnu.org/licenses/>.
*/
package org.dswarm.graph.index;
import java.io.File;
import java.util.Map;
import java.util.Set;
import org.mapdb.Atomic;
import org.mapdb.BTreeKeySerializer;
import org.mapdb.DB;
import org.mapdb.DBMaker;
import org.mapdb.Serializer;
import org.dswarm.common.types.Tuple;
/**
* @author tgaengler
*/
public final class MapDBUtils {
public static final String INDEX_DIR = "index/mapdb";
public static Tuple<Set<Long>, DB> createOrGetInMemoryLongIndexTreeSetNonTransactional(final String indexName) {
final DB db = createNonTransactionalInMemoryMapDB();
return Tuple.tuple(createTreeSet(db, indexName), db);
}
public static Tuple<Map<String, String>, DB> createOrGetInMemoryStringStringIndexTreeMapNonTransactional(final String indexName) {
final DB db = createNonTransactionalInMemoryMapDB();
return Tuple.tuple(createStringStringTreeMap(db, indexName), db);
}
public static Tuple<Set<Long>, DB> createOrGetPersistentLongIndexTreeSetGlobalTransactional(final String indexFileName, final String indexName) {
final DB db = createGlobalTransactionalPermanentMapDB(indexFileName);
return Tuple.tuple(createTreeSet(db, indexName), db);
}
public static Tuple<Map<String, String>, DB> createOrGetPersistentStringStringIndexTreeMapGlobalTransactional(final String indexFileName,
final String indexName) {
final DB db = createGlobalTransactionalPermanentMapDB(indexFileName);
return Tuple.tuple(createStringStringTreeMap(db, indexName), db);
}
public static Tuple<Atomic.Long, DB> createOrGetPersistentLongIndexGlobalTransactional(final String indexFileName, final String indexName) {
final DB db = createGlobalTransactionalPermanentMapDB(indexFileName);
return Tuple.tuple(createLongIndex(db, indexName), db);
}
public static Tuple<Atomic.Long, DB> createOrGetPersistentLongIndexGlobalTransactional(final String indexFileName, final String indexName,
final long initValue) {
final DB db = createGlobalTransactionalPermanentMapDB(indexFileName);
return Tuple.tuple(createOrGetLongIndex(db, indexName, initValue), db);
}
public static Map<String, String> createStringStringTreeMap(final DB db, final String indexName) {
return db.createTreeMap(indexName)
.keySerializer(BTreeKeySerializer.STRING)
.valueSerializer(Serializer.STRING).makeOrGet();
}
public static Atomic.Long createLongIndex(final DB db, final String indexName) {
return db.getAtomicLong(indexName);
}
public static Atomic.Long createOrGetLongIndex(final DB db, final String indexName, final long initValue) {
final Atomic.Long longIndex;
if (db.getCatalog().containsKey(indexName)) {
final Atomic.Long atomicLong = db.getAtomicLong(indexName);
atomicLong.getAndSet(initValue);
longIndex = atomicLong;
db.commit();
} else {
longIndex = db.createAtomicLong(indexName, initValue);
}
return longIndex;
}
public static Set<Long> createTreeSet(final DB db, final String indexName) {
return db.createTreeSet(indexName).makeOrGet();
}
public static DB createNonTransactionalInMemoryMapDB() {
return DBMaker.newMemoryDirectDB()
.asyncWriteEnable()
.closeOnJvmShutdown()
.transactionDisable()
.make();
}
public static DB createGlobalTransactionalPermanentMapDB(final String indexFileName) {
final File file = createFile(indexFileName);
return DBMaker
.newFileDB(file)
.asyncWriteEnable()
.closeOnJvmShutdown()
.make();
}
private static File createFile(final String indexFileName) {
return new File(indexFileName + Statics.INDEX_FILE_ENDING);
}
}