Fixed Tests
This commit is contained in:
parent
78bcb67c67
commit
debe1f70bb
@ -173,12 +173,14 @@ public class DatabaseJava extends DatabaseCore implements IDatabaseTools {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void registerClass(Class<?> type, int id) {
|
public void registerClass(Class<?> type, int id) {
|
||||||
this.objectsIO.registerClass(type, id);
|
this.objectsIO.registerClass(type, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected DatabaseJava instantiateNewDatabase(Path dataFile, Path blocksMetaFile, Path referencesMetaFile) throws IOException {
|
protected DatabaseJava instantiateNewDatabase(Path dataFile, Path blocksMetaFile, Path referencesMetaFile) throws IOException {
|
||||||
return new DatabaseJava(dataFile, blocksMetaFile, referencesMetaFile);
|
DatabaseJava newDatabaseJava = new DatabaseJava(dataFile, blocksMetaFile, referencesMetaFile);
|
||||||
|
this.getObjectsIO().getRegisteredClasses().forEach(newDatabaseJava::registerClass);
|
||||||
|
return newDatabaseJava;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -187,7 +189,7 @@ public class DatabaseJava extends DatabaseCore implements IDatabaseTools {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IObjectsIO getObjectsIO() {
|
public DatabaseObjectsIO getObjectsIO() {
|
||||||
return objectsIO;
|
return objectsIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -443,6 +443,13 @@ public class DatabaseObjectsIO implements IObjectsIO {
|
|||||||
serializer.registerClass(type, realId);
|
serializer.registerClass(type, realId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected Map<Class<?>, Integer> getRegisteredClasses() {
|
||||||
|
Map<Class<?>, Integer> registeredClasses = serializer.getRegisteredClasses();
|
||||||
|
registeredClasses.replaceAll((clazz,id) -> id - 100);
|
||||||
|
registeredClasses.entrySet().removeIf((entry) -> entry.getValue() < 0);
|
||||||
|
return registeredClasses;
|
||||||
|
}
|
||||||
|
|
||||||
private <T extends EnhancedObject> void preloadEnhancedObjectProperties(T obj, long[] propertyReferences) {
|
private <T extends EnhancedObject> void preloadEnhancedObjectProperties(T obj, long[] propertyReferences) {
|
||||||
// Declare the variables needed to getBlock the biggest property Id
|
// Declare the variables needed to getBlock the biggest property Id
|
||||||
Method[] unorderedPropertyGetters = obj.getPropertyGetters();
|
Method[] unorderedPropertyGetters = obj.getPropertyGetters();
|
||||||
@ -621,7 +628,7 @@ public class DatabaseObjectsIO implements IObjectsIO {
|
|||||||
throws IOException {
|
throws IOException {
|
||||||
Object data = loadData_(fieldType, fieldReference);
|
Object data = loadData_(fieldType, fieldReference);
|
||||||
try {
|
try {
|
||||||
if (fieldType == DbDataType.OBJECT && data != null) {
|
if (data != null) {
|
||||||
if (!field.getType().isInstance(data)) {
|
if (!field.getType().isInstance(data)) {
|
||||||
throw new IOException("There is an attempt to load an object of type " + data.getClass()
|
throw new IOException("There is an attempt to load an object of type " + data.getClass()
|
||||||
+ " into a field of type " + field.getType());
|
+ " into a field of type " + field.getType());
|
||||||
@ -629,7 +636,7 @@ public class DatabaseObjectsIO implements IObjectsIO {
|
|||||||
}
|
}
|
||||||
FieldUtils.writeField(field, obj, data, true);
|
FieldUtils.writeField(field, obj, data, true);
|
||||||
} catch (IllegalAccessException e) {
|
} catch (IllegalAccessException e) {
|
||||||
throw new RuntimeException(e);
|
throw new IOException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package it.cavallium.strangedb.java.database;
|
package it.cavallium.strangedb.java.database;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
public interface ISerializer {
|
public interface ISerializer {
|
||||||
<T> Class<T> readClassBytes(byte[] input) throws IOException;
|
<T> Class<T> readClassBytes(byte[] input) throws IOException;
|
||||||
@ -13,4 +14,6 @@ public interface ISerializer {
|
|||||||
<T> T readClassAndObjectBytes(byte[] input) throws IOException;
|
<T> T readClassAndObjectBytes(byte[] input) throws IOException;
|
||||||
|
|
||||||
void registerClass(Class<?> type, int id);
|
void registerClass(Class<?> type, int id);
|
||||||
|
|
||||||
|
Map<Class<?>, Integer> getRegisteredClasses();
|
||||||
}
|
}
|
||||||
|
@ -1,14 +1,12 @@
|
|||||||
package it.cavallium.strangedb.java.database;
|
package it.cavallium.strangedb.java.database;
|
||||||
|
|
||||||
import com.esotericsoftware.kryo.Kryo;
|
import com.esotericsoftware.kryo.Kryo;
|
||||||
import com.esotericsoftware.kryo.io.ByteBufferOutput;
|
|
||||||
import com.esotericsoftware.kryo.io.Input;
|
import com.esotericsoftware.kryo.io.Input;
|
||||||
import com.esotericsoftware.kryo.io.KryoDataOutput;
|
|
||||||
import com.esotericsoftware.kryo.io.Output;
|
import com.esotericsoftware.kryo.io.Output;
|
||||||
|
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.util.HashMap;
|
||||||
import java.io.IOException;
|
import java.util.Map;
|
||||||
import java.nio.ByteBuffer;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
import java.util.concurrent.locks.ReentrantLock;
|
import java.util.concurrent.locks.ReentrantLock;
|
||||||
|
|
||||||
@ -19,6 +17,7 @@ public class KryoSerializer implements ISerializer {
|
|||||||
private ReentrantLock[] locks = new ReentrantLock[KRYO_INSTANCES];
|
private ReentrantLock[] locks = new ReentrantLock[KRYO_INSTANCES];
|
||||||
private final Kryo[] kryo = new Kryo[KRYO_INSTANCES];
|
private final Kryo[] kryo = new Kryo[KRYO_INSTANCES];
|
||||||
private AtomicInteger current = new AtomicInteger(0);
|
private AtomicInteger current = new AtomicInteger(0);
|
||||||
|
private ConcurrentHashMap<Class<?>, Integer> registeredClasses = new ConcurrentHashMap<>(200);
|
||||||
|
|
||||||
public KryoSerializer() {
|
public KryoSerializer() {
|
||||||
for (int i = 0; i < KRYO_INSTANCES; i++) {
|
for (int i = 0; i < KRYO_INSTANCES; i++) {
|
||||||
@ -85,6 +84,7 @@ public class KryoSerializer implements ISerializer {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registerClass(Class<?> type, int id) {
|
public void registerClass(Class<?> type, int id) {
|
||||||
|
registeredClasses.put(type, id);
|
||||||
for (int i = 0; i < KRYO_INSTANCES; i++) {
|
for (int i = 0; i < KRYO_INSTANCES; i++) {
|
||||||
locks[i].lock();
|
locks[i].lock();
|
||||||
try {
|
try {
|
||||||
@ -94,4 +94,18 @@ public class KryoSerializer implements ISerializer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<Class<?>, Integer> getRegisteredClasses() {
|
||||||
|
for (int i = 0; i < KRYO_INSTANCES; i++) {
|
||||||
|
locks[i].lock();
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
return new HashMap<>(registeredClasses);
|
||||||
|
} finally {
|
||||||
|
for (int i = 0; i < KRYO_INSTANCES; i++) {
|
||||||
|
locks[i].unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,8 @@ import it.cavallium.strangedb.java.database.IDatabaseTools;
|
|||||||
import it.cavallium.strangedb.java.objects.EnhancedObject;
|
import it.cavallium.strangedb.java.objects.EnhancedObject;
|
||||||
import it.cavallium.strangedb.java.objects.lists.EnhancedObjectStrangeDbList;
|
import it.cavallium.strangedb.java.objects.lists.EnhancedObjectStrangeDbList;
|
||||||
import it.cavallium.strangedb.java.objects.lists.ObjectStrangeDbList;
|
import it.cavallium.strangedb.java.objects.lists.ObjectStrangeDbList;
|
||||||
|
import it.cavallium.strangedb.utils.NSimplestClass;
|
||||||
|
import it.cavallium.strangedb.utils.NTestUtils;
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
@ -30,54 +32,56 @@ public class ObjectListTests {
|
|||||||
path2 = Files.createTempFile("db-tests-blocks-", ".db");
|
path2 = Files.createTempFile("db-tests-blocks-", ".db");
|
||||||
path3 = Files.createTempFile("db-tests-references-", ".db");
|
path3 = Files.createTempFile("db-tests-references-", ".db");
|
||||||
db = new DatabaseJava(path1, path2, path3);
|
db = new DatabaseJava(path1, path2, path3);
|
||||||
|
registerClasses();
|
||||||
ListsRoot root = db.loadRoot(ListsRoot::new);
|
ListsRoot root = db.loadRoot(ListsRoot::new);
|
||||||
for (int i = 0; i < 5000; i++) {
|
for (int i = 0; i < 500; i++) {
|
||||||
root.objectList.add(new ObjectItem(i));
|
root.objectList.add(new ObjectItem(i));
|
||||||
root.enhancedObjectList.add(new EnhancedObjectItem(db, i));
|
root.enhancedObjectList.add(new EnhancedObjectItem(db, i));
|
||||||
}
|
}
|
||||||
for (int i = 0; i < 5000; i++) {
|
for (int i = 0; i < 500; i++) {
|
||||||
if (i % 10 == 0) {
|
if (i % 10 == 0) {
|
||||||
root.objectList.update(i, new ObjectItem(i));
|
root.objectList.update(i, new ObjectItem(i));
|
||||||
root.enhancedObjectList.update(i, new EnhancedObjectItem(db, i));
|
root.enhancedObjectList.update(i, new EnhancedObjectItem(db, i));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (int i = 0; i < 5000; i++) {
|
for (int i = 0; i < 500; i++) {
|
||||||
if (i % 11 == 0) {
|
if (i % 11 == 0) {
|
||||||
root.objectList.set(i, new ObjectItem(i));
|
root.objectList.set(i, new ObjectItem(i));
|
||||||
root.enhancedObjectList.set(i, new EnhancedObjectItem(db, i));
|
root.enhancedObjectList.set(i, new EnhancedObjectItem(db, i));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (int i = 5000; i < 6000; i++) {
|
for (int i = 500; i < 600; i++) {
|
||||||
root.objectList.add(new ObjectItem(0));
|
root.objectList.add(new ObjectItem(0));
|
||||||
root.enhancedObjectList.add(i, new EnhancedObjectItem(db, 0));
|
root.enhancedObjectList.add(i, new EnhancedObjectItem(db, 0));
|
||||||
}
|
}
|
||||||
db.close();
|
db.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void registerClasses() {
|
||||||
|
int id = 0;
|
||||||
|
db.registerClass(EnhancedObjectItem.class, id++);
|
||||||
|
db.registerClass(ListsRoot.class, id++);
|
||||||
|
db.registerClass(ObjectItem.class, id++);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldUpdateClass() throws IOException {
|
public void shouldUpdateClass() throws IOException {
|
||||||
db = new DatabaseJava(path1, path2, path3);
|
db = new DatabaseJava(path1, path2, path3);
|
||||||
|
registerClasses();
|
||||||
ListsRoot root = db.loadRoot(ListsRoot::new);
|
ListsRoot root = db.loadRoot(ListsRoot::new);
|
||||||
|
|
||||||
new Thread(() -> {
|
|
||||||
try {
|
|
||||||
for (int i = 0; i < 5000; i++) {
|
|
||||||
String val = root.objectList.get(i).value;
|
|
||||||
assertEquals(val, "test_" + i);
|
|
||||||
val = root.enhancedObjectList.get(i).value;
|
|
||||||
assertEquals(val, "test_" + i);
|
|
||||||
}
|
|
||||||
for (int i = 5000; i < 6000; i++) {
|
|
||||||
assertEquals(root.objectList.get(i).value, "test_" + 0);
|
|
||||||
assertEquals(root.enhancedObjectList.get(i).value, "test_" + 0);
|
|
||||||
}
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}).start();
|
|
||||||
try {
|
try {
|
||||||
Thread.sleep(10000);
|
for (int i = 0; i < 500; i++) {
|
||||||
} catch (InterruptedException e) {
|
String val = root.objectList.get(i).value;
|
||||||
|
assertEquals(val, "test_" + i);
|
||||||
|
val = root.enhancedObjectList.get(i).value;
|
||||||
|
assertEquals(val, "test_" + i);
|
||||||
|
}
|
||||||
|
for (int i = 500; i < 600; i++) {
|
||||||
|
assertEquals(root.objectList.get(i).value, "test_" + 0);
|
||||||
|
assertEquals(root.enhancedObjectList.get(i).value, "test_" + 0);
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
db.close();
|
db.close();
|
||||||
|
@ -310,14 +310,14 @@ public class Performance {
|
|||||||
Files.createFile(dbReferencesFile);
|
Files.createFile(dbReferencesFile);
|
||||||
db = new DatabaseJava(dbDataFile, dbBlocksFile, dbReferencesFile);
|
db = new DatabaseJava(dbDataFile, dbBlocksFile, dbReferencesFile);
|
||||||
int i = 0;
|
int i = 0;
|
||||||
db.getObjectsIO().registerClass(SimpleEnhancedObject.class, i++);
|
db.registerClass(SimpleEnhancedObject.class, i++);
|
||||||
db.getObjectsIO().registerClass(PreloadedListContainer.class, i++);
|
db.registerClass(PreloadedListContainer.class, i++);
|
||||||
db.getObjectsIO().registerClass(DynamicListContainer.class, i++);
|
db.registerClass(DynamicListContainer.class, i++);
|
||||||
db.getObjectsIO().registerClass(EMessage.class, i++);
|
db.registerClass(EMessage.class, i++);
|
||||||
db.getObjectsIO().registerClass(EMessageContent.class, i++);
|
db.registerClass(EMessageContent.class, i++);
|
||||||
db.getObjectsIO().registerClass(EMessageText.class, i++);
|
db.registerClass(EMessageText.class, i++);
|
||||||
db.getObjectsIO().registerClass(EMessageOtherContent.class, i++);
|
db.registerClass(EMessageOtherContent.class, i++);
|
||||||
db.getObjectsIO().registerClass(EFormattedText.class, i++);
|
db.registerClass(EFormattedText.class, i++);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void deleteDb() throws IOException {
|
public static void deleteDb() throws IOException {
|
||||||
|
@ -33,9 +33,9 @@ public class QueryTests {
|
|||||||
path3 = Files.createTempFile("db-tests-references-", ".db");
|
path3 = Files.createTempFile("db-tests-references-", ".db");
|
||||||
db = new DatabaseJava(path1, path2, path3);
|
db = new DatabaseJava(path1, path2, path3);
|
||||||
int i = 0;
|
int i = 0;
|
||||||
db.getObjectsIO().registerClass(UserFullInfo.class, i++);
|
db.registerClass(UserFullInfo.class, i++);
|
||||||
db.getObjectsIO().registerClass(User.class, i++);
|
db.registerClass(User.class, i++);
|
||||||
db.getObjectsIO().registerClass(ListContainer.class, i++);
|
db.registerClass(ListContainer.class, i++);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -43,12 +43,16 @@ public class NTestUtils {
|
|||||||
|
|
||||||
public WrappedDb create(ConsumerWithIO<NTestUtils.WrappedDb> r) throws IOException {
|
public WrappedDb create(ConsumerWithIO<NTestUtils.WrappedDb> r) throws IOException {
|
||||||
this.r = () -> r.accept(WrappedDb.this);
|
this.r = () -> r.accept(WrappedDb.this);
|
||||||
this.create();
|
return this.create();
|
||||||
return this;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private DatabaseJava openDatabase() throws IOException {
|
private DatabaseJava openDatabase() throws IOException {
|
||||||
return new DatabaseJava(tempDir.resolve(Paths.get("data.db")), tempDir.resolve(Paths.get("blocks.dat")), tempDir.resolve(Paths.get("references.dat")));
|
DatabaseJava db = new DatabaseJava(tempDir.resolve(Paths.get("data.db")), tempDir.resolve(Paths.get("blocks.dat")), tempDir.resolve(Paths.get("references.dat")));
|
||||||
|
int id = 0;
|
||||||
|
db.registerClass(RootClass.class, id++);
|
||||||
|
db.registerClass(LongArrayList.class, id++);
|
||||||
|
db.registerClass(NSimplestClass.class, id++);
|
||||||
|
return db;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void delete() throws IOException {
|
public void delete() throws IOException {
|
||||||
|
Loading…
Reference in New Issue
Block a user