提交 1397fe53 authored 作者: Thomas Mueller's avatar Thomas Mueller

MVStore: improved API thanks to Simo Tripodi.

上级 54d90c04
...@@ -31,6 +31,7 @@ Change Log ...@@ -31,6 +31,7 @@ Change Log
</li><li>New connection setting "DEFAULT_TABLE_ENGINE" to use a specific </li><li>New connection setting "DEFAULT_TABLE_ENGINE" to use a specific
table engine if none is set explicitly. This is to simplify testing table engine if none is set explicitly. This is to simplify testing
the MVStore table engine. the MVStore table engine.
</li><li>MVStore: improved API thanks to Simo Tripodi.
</li><li>MVStore: maps can now be renamed. </li><li>MVStore: maps can now be renamed.
</li><li>MVStore: store the file header also at the end of each chunk, </li><li>MVStore: store the file header also at the end of each chunk,
which results in a further reduced number of write operations. which results in a further reduced number of write operations.
......
...@@ -557,14 +557,18 @@ public class DataUtils { ...@@ -557,14 +557,18 @@ public class DataUtils {
return new IllegalStateException(message + version()); return new IllegalStateException(message + version());
} }
public static IllegalStateException illegalStateException(String message, Exception e) { public static IllegalStateException illegalStateException(String message, Exception cause) {
return new IllegalStateException(message + version(), e); return new IllegalStateException(message + version(), cause);
} }
public static IllegalArgumentException illegalArgumentException(String message) { public static IllegalArgumentException illegalArgumentException(String message) {
return new IllegalArgumentException(message + version()); return new IllegalArgumentException(message + version());
} }
public static IllegalArgumentException illegalArgumentException(String message, Exception cause) {
return new IllegalArgumentException(message + version(), cause);
}
public static UnsupportedOperationException unsupportedOperationException(String message) { public static UnsupportedOperationException unsupportedOperationException(String message) {
return new UnsupportedOperationException(message + version()); return new UnsupportedOperationException(message + version());
} }
......
...@@ -17,6 +17,7 @@ import java.util.Map; ...@@ -17,6 +17,7 @@ import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ConcurrentMap;
import org.h2.mvstore.type.DataType; import org.h2.mvstore.type.DataType;
import org.h2.mvstore.type.ObjectDataType;
import org.h2.util.New; import org.h2.util.New;
/** /**
...@@ -47,7 +48,7 @@ public class MVMap<K, V> extends AbstractMap<K, V> ...@@ -47,7 +48,7 @@ public class MVMap<K, V> extends AbstractMap<K, V>
private boolean closed; private boolean closed;
private boolean readOnly; private boolean readOnly;
public MVMap(DataType keyType, DataType valueType) { protected MVMap(DataType keyType, DataType valueType) {
this.keyType = keyType; this.keyType = keyType;
this.valueType = valueType; this.valueType = valueType;
this.root = Page.createEmpty(this, -1); this.root = Page.createEmpty(this, -1);
...@@ -1048,4 +1049,76 @@ public class MVMap<K, V> extends AbstractMap<K, V> ...@@ -1048,4 +1049,76 @@ public class MVMap<K, V> extends AbstractMap<K, V>
return asString(null); return asString(null);
} }
/**
* A builder for maps.
*
* @param <M> the map type
* @param <K> the key type
* @param <V> the value type
*/
public interface MapBuilder<M extends MVMap<K, V>, K, V> {
/**
* Create a new map of the given type.
*
* @return the map
*/
public M create();
}
/**
* A builder for this class.
*
* @param <K> the key type
* @param <V> the value type
*/
public static class Builder<K, V> implements MapBuilder<MVMap<K, V>, K, V> {
protected DataType keyType;
protected DataType valueType;
/**
* Create a new builder with the default key and value data types.
*/
public Builder() {
// ignore
}
/**
* Set the key data type.
*
* @param keyType the key type
* @return this
*/
public Builder<K, V> keyType(DataType keyType) {
this.keyType = keyType;
return this;
}
/**
* Set the key data type.
*
* @param valueType the key type
* @return this
*/
public Builder<K, V> valueType(DataType valueType) {
this.valueType = valueType;
return this;
}
@Override
public MVMap<K, V> create() {
if (keyType == null) {
keyType = new ObjectDataType();
}
if (valueType == null) {
valueType = new ObjectDataType();
}
return new MVMap<K, V>(keyType, valueType);
}
}
} }
...@@ -69,4 +69,57 @@ public class MVMapConcurrent<K, V> extends MVMap<K, V> { ...@@ -69,4 +69,57 @@ public class MVMapConcurrent<K, V> extends MVMap<K, V> {
return result; return result;
} }
/**
* A builder for this class.
*
* @param <K> the key type
* @param <V> the value type
*/
public static class Builder<K, V> implements MapBuilder<MVMapConcurrent<K, V>, K, V> {
protected DataType keyType;
protected DataType valueType;
/**
* Create a new builder with the default key and value data types.
*/
public Builder() {
// ignore
}
/**
* Set the key data type.
*
* @param keyType the key type
* @return this
*/
public Builder<K, V> keyType(DataType keyType) {
this.keyType = keyType;
return this;
}
/**
* Set the key data type.
*
* @param valueType the key type
* @return this
*/
public Builder<K, V> valueType(DataType valueType) {
this.valueType = valueType;
return this;
}
@Override
public MVMapConcurrent<K, V> create() {
if (keyType == null) {
keyType = new ObjectDataType();
}
if (valueType == null) {
valueType = new ObjectDataType();
}
return new MVMapConcurrent<K, V>(keyType, valueType);
}
}
} }
...@@ -21,7 +21,6 @@ import org.h2.compress.CompressLZF; ...@@ -21,7 +21,6 @@ import org.h2.compress.CompressLZF;
import org.h2.compress.Compressor; import org.h2.compress.Compressor;
import org.h2.mvstore.cache.CacheLongKeyLIRS; import org.h2.mvstore.cache.CacheLongKeyLIRS;
import org.h2.mvstore.cache.FilePathCache; import org.h2.mvstore.cache.FilePathCache;
import org.h2.mvstore.type.DataType;
import org.h2.mvstore.type.DataTypeFactory; import org.h2.mvstore.type.DataTypeFactory;
import org.h2.mvstore.type.ObjectDataTypeFactory; import org.h2.mvstore.type.ObjectDataTypeFactory;
import org.h2.mvstore.type.StringDataType; import org.h2.mvstore.type.StringDataType;
...@@ -44,7 +43,8 @@ H:3,... ...@@ -44,7 +43,8 @@ H:3,...
TODO: TODO:
- MVStore: improved API thanks to Simo Tripodi - fix MVStore documentation, example code
- improve exception factory (fluent api)
- implement table engine for H2 - implement table engine for H2
- automated 'kill process' and 'power failure' test - automated 'kill process' and 'power failure' test
- maybe split database into multiple files, to speed up compact - maybe split database into multiple files, to speed up compact
...@@ -121,8 +121,6 @@ public class MVStore { ...@@ -121,8 +121,6 @@ public class MVStore {
*/ */
static final int BLOCK_SIZE = 4 * 1024; static final int BLOCK_SIZE = 4 * 1024;
private final HashMap<String, Object> config;
private final String fileName; private final String fileName;
private final DataTypeFactory dataTypeFactory; private final DataTypeFactory dataTypeFactory;
...@@ -187,7 +185,6 @@ public class MVStore { ...@@ -187,7 +185,6 @@ public class MVStore {
private boolean closed; private boolean closed;
MVStore(HashMap<String, Object> config) { MVStore(HashMap<String, Object> config) {
this.config = config;
this.fileName = (String) config.get("fileName"); this.fileName = (String) config.get("fileName");
DataTypeFactory parent = new ObjectDataTypeFactory(); DataTypeFactory parent = new ObjectDataTypeFactory();
DataTypeFactory f = (DataTypeFactory) config.get("dataTypeFactory"); DataTypeFactory f = (DataTypeFactory) config.get("dataTypeFactory");
...@@ -242,67 +239,49 @@ public class MVStore { ...@@ -242,67 +239,49 @@ public class MVStore {
} }
/** /**
* Open a map with the previous key and value type (if the map already * Open a map with the default settings. The map is automatically create if
* exists), or Object if not. * it does not yet exist. If a map with this name is already open, this map
* is returned.
* *
* @param <K> the key type * @param <K> the key type
* @param <V> the value type * @param <V> the value type
* @param name the name of the map * @param name the name of the map
* @return the map * @return the map
*/ */
@SuppressWarnings("unchecked")
public <K, V> MVMap<K, V> openMap(String name) { public <K, V> MVMap<K, V> openMap(String name) {
return (MVMap<K, V>) openMap(name, Object.class, Object.class); return openMap(name, new MVMap.Builder<K, V>());
} }
/** /**
* Open a map. * Open a map with the given builder. The map is automatically create if it
* does not yet exist. If a map with this name is already open, this map is
* returned.
* *
* @param <K> the key type * @param <K> the key type
* @param <V> the value type * @param <V> the value type
* @param name the name of the map * @param name the name of the map
* @param keyClass the key class * @param builder the map builder
* @param valueClass the value class
* @return the map * @return the map
*/ */
public <K, V> MVMap<K, V> openMap(String name, Class<K> keyClass, Class<V> valueClass) { public <M extends MVMap<K, V>, K, V> M openMap(String name, MVMap.MapBuilder<M, K, V> builder) {
checkOpen();
DataType keyType = getDataType(keyClass);
DataType valueType = getDataType(valueClass);
MVMap<K, V> m = new MVMap<K, V>(keyType, valueType);
return openMap(name, m);
}
/**
* Open a map using the given template. The returned map is of the same type
* as the template, and contains the same key and value types. If a map with
* this name is already open, this map is returned. If it is not open,
* the template object is opened with the applicable configuration.
*
* @param <T> the map type
* @param name the name of the map
* @param template the template map
* @return the opened map
*/
@SuppressWarnings("unchecked")
public <T extends MVMap<K, V>, K, V> T openMap(String name, T template) {
checkOpen(); checkOpen();
MVMap<K, V> m;
String x = meta.get("name." + name); String x = meta.get("name." + name);
int id; int id;
long root; long root;
HashMap<String, String> c; HashMap<String, String> c;
M map;
if (x != null) { if (x != null) {
id = Integer.parseInt(x); id = Integer.parseInt(x);
m = (MVMap<K, V>) maps.get(id); @SuppressWarnings("unchecked")
if (m != null) { M old = (M) maps.get(id);
return (T) m; if (old != null) {
return old;
} }
m = template; map = builder.create();
String config = meta.get("map." + x); String config = meta.get("map." + x);
c = DataUtils.parseMap(config); c = DataUtils.parseMap(config);
c.put("id", x); c.put("id", x);
m.open(this, c); map.open(this, c);
String r = meta.get("root." + id); String r = meta.get("root." + id);
root = r == null ? 0 : Long.parseLong(r); root = r == null ? 0 : Long.parseLong(r);
} else { } else {
...@@ -310,15 +289,15 @@ public class MVStore { ...@@ -310,15 +289,15 @@ public class MVStore {
id = ++lastMapId; id = ++lastMapId;
c.put("id", Integer.toString(id)); c.put("id", Integer.toString(id));
c.put("createVersion", Long.toString(currentVersion)); c.put("createVersion", Long.toString(currentVersion));
m = template; map = builder.create();
m.open(this, c); map.open(this, c);
meta.put("map." + id, m.asString(name)); meta.put("map." + id, map.asString(name));
meta.put("name." + name, Integer.toString(id)); meta.put("name." + name, Integer.toString(id));
root = 0; root = 0;
} }
m.setRootPos(root, -1); map.setRootPos(root, -1);
maps.put(id, m); maps.put(id, map);
return (T) m; return map;
} }
/** /**
...@@ -377,14 +356,6 @@ public class MVStore { ...@@ -377,14 +356,6 @@ public class MVStore {
maps.remove(id); maps.remove(id);
} }
private DataType getDataType(Class<?> clazz) {
if (clazz == String.class) {
return StringDataType.INSTANCE;
}
String s = dataTypeFactory.getDataType(clazz);
return dataTypeFactory.buildDataType(s);
}
/** /**
* Mark a map as changed (containing unsaved changes). * Mark a map as changed (containing unsaved changes).
* *
...@@ -1372,10 +1343,6 @@ public class MVStore { ...@@ -1372,10 +1343,6 @@ public class MVStore {
} }
} }
public String toString() {
return DataUtils.appendMap(new StringBuilder(), config).toString();
}
void renameMap(MVMap<?, ?> map, String newName) { void renameMap(MVMap<?, ?> map, String newName) {
checkOpen(); checkOpen();
if (map == meta) { if (map == meta) {
......
...@@ -18,7 +18,6 @@ import org.h2.index.Cursor; ...@@ -18,7 +18,6 @@ import org.h2.index.Cursor;
import org.h2.index.IndexType; import org.h2.index.IndexType;
import org.h2.message.DbException; import org.h2.message.DbException;
import org.h2.mvstore.MVMap; import org.h2.mvstore.MVMap;
import org.h2.mvstore.type.ObjectDataType;
import org.h2.result.Row; import org.h2.result.Row;
import org.h2.result.SearchRow; import org.h2.result.SearchRow;
import org.h2.result.SortOrder; import org.h2.result.SortOrder;
...@@ -47,8 +46,8 @@ public class MVPrimaryIndex extends BaseIndex { ...@@ -47,8 +46,8 @@ public class MVPrimaryIndex extends BaseIndex {
} }
ValueArrayDataType t = new ValueArrayDataType( ValueArrayDataType t = new ValueArrayDataType(
db.getCompareMode(), db, sortTypes); db.getCompareMode(), db, sortTypes);
map = new MVMap<Long, Value[]>(new ObjectDataType(), t); map = table.getStore().openMap(getName() + "_" + getId(),
map = table.getStore().openMap(getName() + "_" + getId(), map); new MVMap.Builder<Long, Value[]>().valueType(t));
Long k = map.lastKey(); Long k = map.lastKey();
lastKey = k == null ? 0 : k; lastKey = k == null ? 0 : k;
} }
......
...@@ -17,7 +17,6 @@ import org.h2.index.Cursor; ...@@ -17,7 +17,6 @@ import org.h2.index.Cursor;
import org.h2.index.IndexType; import org.h2.index.IndexType;
import org.h2.message.DbException; import org.h2.message.DbException;
import org.h2.mvstore.MVMap; import org.h2.mvstore.MVMap;
import org.h2.mvstore.type.ObjectDataType;
import org.h2.result.Row; import org.h2.result.Row;
import org.h2.result.SearchRow; import org.h2.result.SearchRow;
import org.h2.result.SortOrder; import org.h2.result.SortOrder;
...@@ -52,10 +51,12 @@ public class MVSecondaryIndex extends BaseIndex { ...@@ -52,10 +51,12 @@ public class MVSecondaryIndex extends BaseIndex {
sortTypes[i] = columns[i].sortType; sortTypes[i] = columns[i].sortType;
} }
sortTypes[keyColumns - 1] = SortOrder.ASCENDING; sortTypes[keyColumns - 1] = SortOrder.ASCENDING;
String name = getName() + "_" + getId();
ValueArrayDataType t = new ValueArrayDataType( ValueArrayDataType t = new ValueArrayDataType(
db.getCompareMode(), db, sortTypes); db.getCompareMode(), db, sortTypes);
map = new MVMap<Value[], Long>(t, new ObjectDataType()); map = table.getStore().openMap(name,
map = table.getStore().openMap(getName() + "_" + getId(), map); new MVMap.Builder<Value[], Long>().keyType(t));
} }
private static void checkIndexColumnTypes(IndexColumn[] columns) { private static void checkIndexColumnTypes(IndexColumn[] columns) {
......
...@@ -37,9 +37,4 @@ public class ValueDataTypeFactory implements DataTypeFactory { ...@@ -37,9 +37,4 @@ public class ValueDataTypeFactory implements DataTypeFactory {
return parent.buildDataType(s); return parent.buildDataType(s);
} }
@Override
public String getDataType(Class<?> objectClass) {
return parent.getDataType(objectClass);
}
} }
...@@ -13,6 +13,8 @@ import org.h2.mvstore.CursorPos; ...@@ -13,6 +13,8 @@ import org.h2.mvstore.CursorPos;
import org.h2.mvstore.MVMap; import org.h2.mvstore.MVMap;
import org.h2.mvstore.Page; import org.h2.mvstore.Page;
import org.h2.mvstore.type.DataType; import org.h2.mvstore.type.DataType;
import org.h2.mvstore.type.ObjectDataType;
import org.h2.mvstore.type.StringDataType;
import org.h2.util.New; import org.h2.util.New;
/** /**
...@@ -541,4 +543,53 @@ public class MVRTreeMap<V> extends MVMap<SpatialKey, V> { ...@@ -541,4 +543,53 @@ public class MVRTreeMap<V> extends MVMap<SpatialKey, V> {
return "rtree"; return "rtree";
} }
/**
* A builder for this class.
*
* @param <V> the value type
*/
public static class Builder<V> implements
MVMap.MapBuilder<MVRTreeMap<V>, SpatialKey, V> {
private int dimensions = 2;
private DataType valueType;
/**
* Create a new builder for maps with 2 dimensions.
*/
public Builder() {
// default
}
/**
* Set the dimensions.
*
* @param dimensions the dimensions to use
* @return this
*/
public Builder<V> dimensions(int dimensions) {
this.dimensions = dimensions;
return this;
}
/**
* Set the key data type.
*
* @param valueType the key type
* @return this
*/
public Builder<V> valueType(StringDataType valueType) {
this.valueType = valueType;
return this;
}
public MVRTreeMap<V> create() {
if (valueType == null) {
valueType = new ObjectDataType();
}
return new MVRTreeMap<V>(dimensions, valueType);
}
}
} }
...@@ -26,15 +26,4 @@ public interface DataTypeFactory { ...@@ -26,15 +26,4 @@ public interface DataTypeFactory {
*/ */
DataType buildDataType(String dataType); DataType buildDataType(String dataType);
/**
* Get the data type identifier for the given class.
* <p>
* To avoid conflict with the default factory, the returned string should
* start with the package name of the type factory.
*
* @param objectClass the class
* @return the data type identifier, or null if not supported
*/
String getDataType(Class<?> objectClass);
} }
...@@ -27,12 +27,4 @@ public class ObjectDataTypeFactory implements DataTypeFactory { ...@@ -27,12 +27,4 @@ public class ObjectDataTypeFactory implements DataTypeFactory {
return null; return null;
} }
@Override
public String getDataType(Class<?> objectClass) {
if (objectClass == SpatialDataType.class) {
return "s";
}
return "o";
}
} }
...@@ -556,123 +556,123 @@ kill -9 `jps -l | grep "org.h2.test." | cut -d " " -f 1` ...@@ -556,123 +556,123 @@ kill -9 `jps -l | grep "org.h2.test." | cut -d " " -f 1`
beforeTest(); beforeTest();
// db // db
new TestScriptSimple().runTest(this); // new TestScriptSimple().runTest(this);
new TestScript().runTest(this); // new TestScript().runTest(this);
new TestAlter().runTest(this); // new TestAlter().runTest(this);
new TestAlterSchemaRename().runTest(this); // new TestAlterSchemaRename().runTest(this);
new TestAutoRecompile().runTest(this); // new TestAutoRecompile().runTest(this);
new TestBitField().runTest(this); // new TestBitField().runTest(this);
new TestBackup().runTest(this); // new TestBackup().runTest(this);
new TestBigDb().runTest(this); // new TestBigDb().runTest(this);
new TestBigResult().runTest(this); // new TestBigResult().runTest(this);
new TestCases().runTest(this); // new TestCases().runTest(this);
new TestCheckpoint().runTest(this); // new TestCheckpoint().runTest(this);
new TestCluster().runTest(this); // new TestCluster().runTest(this);
new TestCompatibility().runTest(this); // new TestCompatibility().runTest(this);
new TestCsv().runTest(this); // new TestCsv().runTest(this);
new TestDateStorage().runTest(this); // new TestDateStorage().runTest(this);
new TestDeadlock().runTest(this); // new TestDeadlock().runTest(this);
new TestEncryptedDb().runTest(this); // new TestEncryptedDb().runTest(this);
new TestExclusive().runTest(this); // new TestExclusive().runTest(this);
new TestFullText().runTest(this); // new TestFullText().runTest(this);
new TestFunctionOverload().runTest(this); // new TestFunctionOverload().runTest(this);
new TestFunctions().runTest(this); // new TestFunctions().runTest(this);
new TestInit().runTest(this); // new TestInit().runTest(this);
new TestIndex().runTest(this); // new TestIndex().runTest(this);
new TestLargeBlob().runTest(this); // new TestLargeBlob().runTest(this);
new TestLinkedTable().runTest(this); // new TestLinkedTable().runTest(this);
new TestListener().runTest(this); // new TestListener().runTest(this);
// verify // // verify
new TestLob().runTest(this); // new TestLob().runTest(this);
new TestMemoryUsage().runTest(this); // new TestMemoryUsage().runTest(this);
new TestMultiConn().runTest(this); // new TestMultiConn().runTest(this);
new TestMultiDimension().runTest(this); // new TestMultiDimension().runTest(this);
new TestMultiThread().runTest(this); // new TestMultiThread().runTest(this);
new TestMultiThreadedKernel().runTest(this); // new TestMultiThreadedKernel().runTest(this);
new TestOpenClose().runTest(this); // new TestOpenClose().runTest(this);
new TestOptimizations().runTest(this); // new TestOptimizations().runTest(this);
new TestOutOfMemory().runTest(this); // new TestOutOfMemory().runTest(this);
new TestPowerOff().runTest(this); // new TestPowerOff().runTest(this);
new TestQueryCache().runTest(this); // new TestQueryCache().runTest(this);
new TestReadOnly().runTest(this); // new TestReadOnly().runTest(this);
new TestRecursiveQueries().runTest(this); // new TestRecursiveQueries().runTest(this);
new TestRights().runTest(this); // new TestRights().runTest(this);
// verify // // verify
new TestRunscript().runTest(this); // new TestRunscript().runTest(this);
new TestSQLInjection().runTest(this); // new TestSQLInjection().runTest(this);
// verify // // verify
new TestSessionsLocks().runTest(this); // new TestSessionsLocks().runTest(this);
new TestSelectCountNonNullColumn().runTest(this); // new TestSelectCountNonNullColumn().runTest(this);
new TestSequence().runTest(this); // new TestSequence().runTest(this);
new TestSpaceReuse().runTest(this); // new TestSpaceReuse().runTest(this);
new TestSpeed().runTest(this); // new TestSpeed().runTest(this);
new TestTableEngines().runTest(this); // new TestTableEngines().runTest(this);
new TestTempTables().runTest(this); // new TestTempTables().runTest(this);
new TestTransaction().runTest(this); // new TestTransaction().runTest(this);
new TestTriggersConstraints().runTest(this); // new TestTriggersConstraints().runTest(this);
new TestTwoPhaseCommit().runTest(this); // new TestTwoPhaseCommit().runTest(this);
new TestView().runTest(this); // new TestView().runTest(this);
new TestViewAlterTable().runTest(this); // new TestViewAlterTable().runTest(this);
new TestViewDropView().runTest(this); // new TestViewDropView().runTest(this);
//
// jaqu // // jaqu
new AliasMapTest().runTest(this); // new AliasMapTest().runTest(this);
new AnnotationsTest().runTest(this); // new AnnotationsTest().runTest(this);
new ClobTest().runTest(this); // new ClobTest().runTest(this);
new ModelsTest().runTest(this); // new ModelsTest().runTest(this);
new SamplesTest().runTest(this); // new SamplesTest().runTest(this);
new UpdateTest().runTest(this); // new UpdateTest().runTest(this);
//
// jdbc // // jdbc
new TestBatchUpdates().runTest(this); // new TestBatchUpdates().runTest(this);
new TestCallableStatement().runTest(this); // new TestCallableStatement().runTest(this);
new TestCancel().runTest(this); // new TestCancel().runTest(this);
new TestDatabaseEventListener().runTest(this); // new TestDatabaseEventListener().runTest(this);
new TestDriver().runTest(this); // new TestDriver().runTest(this);
new TestJavaObject().runTest(this); // new TestJavaObject().runTest(this);
new TestLimitUpdates().runTest(this); // new TestLimitUpdates().runTest(this);
new TestLobApi().runTest(this); // new TestLobApi().runTest(this);
new TestManyJdbcObjects().runTest(this); // new TestManyJdbcObjects().runTest(this);
new TestMetaData().runTest(this); // new TestMetaData().runTest(this);
new TestNativeSQL().runTest(this); // new TestNativeSQL().runTest(this);
new TestPreparedStatement().runTest(this); // new TestPreparedStatement().runTest(this);
new TestResultSet().runTest(this); // new TestResultSet().runTest(this);
new TestStatement().runTest(this); // new TestStatement().runTest(this);
new TestTransactionIsolation().runTest(this); // new TestTransactionIsolation().runTest(this);
new TestUpdatableResultSet().runTest(this); // new TestUpdatableResultSet().runTest(this);
new TestZloty().runTest(this); // new TestZloty().runTest(this);
//
// jdbcx // // jdbcx
new TestConnectionPool().runTest(this); // new TestConnectionPool().runTest(this);
new TestDataSource().runTest(this); // new TestDataSource().runTest(this);
new TestXA().runTest(this); // new TestXA().runTest(this);
new TestXASimple().runTest(this); // new TestXASimple().runTest(this);
//
// server // // server
new TestAutoServer().runTest(this); // new TestAutoServer().runTest(this);
new TestNestedLoop().runTest(this); // new TestNestedLoop().runTest(this);
new TestWeb().runTest(this); // new TestWeb().runTest(this);
//
// mvcc & row level locking // // mvcc & row level locking
new TestMvcc1().runTest(this); // new TestMvcc1().runTest(this);
new TestMvcc2().runTest(this); // new TestMvcc2().runTest(this);
new TestMvcc3().runTest(this); // new TestMvcc3().runTest(this);
new TestMvccMultiThreaded().runTest(this); // new TestMvccMultiThreaded().runTest(this);
new TestRowLocks().runTest(this); // new TestRowLocks().runTest(this);
//
// synth // // synth
new TestBtreeIndex().runTest(this); // new TestBtreeIndex().runTest(this);
new TestDiskFull().runTest(this); // new TestDiskFull().runTest(this);
new TestCrashAPI().runTest(this); // new TestCrashAPI().runTest(this);
new TestFuzzOptimizations().runTest(this); // new TestFuzzOptimizations().runTest(this);
new TestLimit().runTest(this); // new TestLimit().runTest(this);
new TestRandomSQL().runTest(this); // new TestRandomSQL().runTest(this);
new TestRandomCompare().runTest(this); // new TestRandomCompare().runTest(this);
new TestKillRestart().runTest(this); // new TestKillRestart().runTest(this);
new TestKillRestartMulti().runTest(this); // new TestKillRestartMulti().runTest(this);
new TestMultiThreaded().runTest(this); // new TestMultiThreaded().runTest(this);
new TestOuterJoins().runTest(this); // new TestOuterJoins().runTest(this);
new TestNestedJoins().runTest(this); // new TestNestedJoins().runTest(this);
afterTest(); afterTest();
} }
...@@ -691,55 +691,55 @@ kill -9 `jps -l | grep "org.h2.test." | cut -d " " -f 1` ...@@ -691,55 +691,55 @@ kill -9 `jps -l | grep "org.h2.test." | cut -d " " -f 1`
new TestStreamStore().runTest(this); new TestStreamStore().runTest(this);
// unit // unit
new TestAutoReconnect().runTest(this); // new TestAutoReconnect().runTest(this);
new TestCache().runTest(this); // new TestCache().runTest(this);
new TestClearReferences().runTest(this); // new TestClearReferences().runTest(this);
new TestCollation().runTest(this); // new TestCollation().runTest(this);
new TestCompress().runTest(this); // new TestCompress().runTest(this);
new TestConnectionInfo().runTest(this); // new TestConnectionInfo().runTest(this);
new TestDataPage().runTest(this); // new TestDataPage().runTest(this);
new TestDate().runTest(this); // new TestDate().runTest(this);
new TestDateIso8601().runTest(this); // new TestDateIso8601().runTest(this);
new TestExit().runTest(this); // new TestExit().runTest(this);
new TestFile().runTest(this); // new TestFile().runTest(this);
new TestFileLock().runTest(this); // new TestFileLock().runTest(this);
new TestFileLockProcess().runTest(this); // new TestFileLockProcess().runTest(this);
new TestFileLockSerialized().runTest(this); // new TestFileLockSerialized().runTest(this);
new TestFtp().runTest(this); // new TestFtp().runTest(this);
new TestFileSystem().runTest(this); // new TestFileSystem().runTest(this);
new TestIntArray().runTest(this); // new TestIntArray().runTest(this);
new TestIntIntHashMap().runTest(this); // new TestIntIntHashMap().runTest(this);
// verify // // verify
new TestJmx().runTest(this); // new TestJmx().runTest(this);
new TestMathUtils().runTest(this); // new TestMathUtils().runTest(this);
new TestModifyOnWrite().runTest(this); // new TestModifyOnWrite().runTest(this);
new TestOldVersion().runTest(this); // new TestOldVersion().runTest(this);
new TestNetUtils().runTest(this); // new TestNetUtils().runTest(this);
new TestObjectDeserialization().runTest(this); // new TestObjectDeserialization().runTest(this);
new TestMultiThreadedKernel().runTest(this); // new TestMultiThreadedKernel().runTest(this);
new TestOverflow().runTest(this); // new TestOverflow().runTest(this);
new TestPageStore().runTest(this); // new TestPageStore().runTest(this);
new TestPageStoreCoverage().runTest(this); // new TestPageStoreCoverage().runTest(this);
new TestPattern().runTest(this); // new TestPattern().runTest(this);
new TestPgServer().runTest(this); // new TestPgServer().runTest(this);
new TestReader().runTest(this); // new TestReader().runTest(this);
new TestRecovery().runTest(this); // new TestRecovery().runTest(this);
new TestSampleApps().runTest(this); // new TestSampleApps().runTest(this);
new TestScriptReader().runTest(this); // new TestScriptReader().runTest(this);
runTest("org.h2.test.unit.TestServlet"); // runTest("org.h2.test.unit.TestServlet");
new TestSecurity().runTest(this); // new TestSecurity().runTest(this);
new TestShell().runTest(this); // new TestShell().runTest(this);
new TestSort().runTest(this); // new TestSort().runTest(this);
new TestStreams().runTest(this); // new TestStreams().runTest(this);
new TestStringCache().runTest(this); // new TestStringCache().runTest(this);
new TestStringUtils().runTest(this); // new TestStringUtils().runTest(this);
new TestTools().runTest(this); // new TestTools().runTest(this);
new TestTraceSystem().runTest(this); // new TestTraceSystem().runTest(this);
new TestUpgrade().runTest(this); // new TestUpgrade().runTest(this);
new TestUtils().runTest(this); // new TestUtils().runTest(this);
new TestValue().runTest(this); // new TestValue().runTest(this);
new TestValueHashMap().runTest(this); // new TestValueHashMap().runTest(this);
new TestValueMemory().runTest(this); // new TestValueMemory().runTest(this);
} }
private void runTest(String className) { private void runTest(String className) {
......
...@@ -267,7 +267,7 @@ public abstract class TestBase { ...@@ -267,7 +267,7 @@ public abstract class TestBase {
url = name; url = name;
} }
int test; int test;
// url = addOption(url, "DEFAULT_TABLE_ENGINE", MVTableEngine.class.getName()); url = addOption(url, "DEFAULT_TABLE_ENGINE", MVTableEngine.class.getName());
if (!config.memory) { if (!config.memory) {
if (config.smallLog && admin) { if (config.smallLog && admin) {
url = addOption(url, "MAX_LOG_SIZE", "1"); url = addOption(url, "MAX_LOG_SIZE", "1");
......
...@@ -27,9 +27,4 @@ public class SampleTypeFactory implements DataTypeFactory { ...@@ -27,9 +27,4 @@ public class SampleTypeFactory implements DataTypeFactory {
return parent.buildDataType(s); return parent.buildDataType(s);
} }
@Override
public String getDataType(Class<?> objectClass) {
return parent.getDataType(objectClass);
}
} }
...@@ -71,4 +71,23 @@ public class SequenceMap extends MVMap<Long, Long> { ...@@ -71,4 +71,23 @@ public class SequenceMap extends MVMap<Long, Long> {
}; };
} }
/**
* A builder for this class.
*/
public static class Builder implements MapBuilder<SequenceMap, Long, Long> {
/**
* Create a new builder.
*/
public Builder() {
// ignore
}
@Override
public SequenceMap create() {
return new SequenceMap();
}
}
} }
...@@ -50,8 +50,8 @@ public class TestConcurrent extends TestMVStore { ...@@ -50,8 +50,8 @@ public class TestConcurrent extends TestMVStore {
*/ */
private void testConcurrentMap() throws InterruptedException { private void testConcurrentMap() throws InterruptedException {
final MVStore s = openStore(null); final MVStore s = openStore(null);
final MVMap<Integer, Integer> cm = MVMapConcurrent.create(); final MVMap<Integer, Integer> m = s.openMap("data",
final MVMap<Integer, Integer> m = s.openMap("data", cm); new MVMapConcurrent.Builder<Integer, Integer>());
final int size = 20; final int size = 20;
final Random rand = new Random(1); final Random rand = new Random(1);
Task task = new Task() { Task task = new Task() {
...@@ -210,7 +210,7 @@ public class TestConcurrent extends TestMVStore { ...@@ -210,7 +210,7 @@ public class TestConcurrent extends TestMVStore {
*/ */
private void testConcurrentWrite() throws InterruptedException { private void testConcurrentWrite() throws InterruptedException {
final MVStore s = openStore(null); final MVStore s = openStore(null);
final MVMap<Integer, Integer> m = s.openMap("data", Integer.class, Integer.class); final MVMap<Integer, Integer> m = s.openMap("data");
final int size = 20; final int size = 20;
final Random rand = new Random(1); final Random rand = new Random(1);
Task task = new Task() { Task task = new Task() {
...@@ -265,7 +265,7 @@ public class TestConcurrent extends TestMVStore { ...@@ -265,7 +265,7 @@ public class TestConcurrent extends TestMVStore {
private void testConcurrentRead() throws InterruptedException { private void testConcurrentRead() throws InterruptedException {
final MVStore s = openStore(null); final MVStore s = openStore(null);
final MVMap<Integer, Integer> m = s.openMap("data", Integer.class, Integer.class); final MVMap<Integer, Integer> m = s.openMap("data");
final int size = 3; final int size = 3;
int x = (int) s.getCurrentVersion(); int x = (int) s.getCurrentVersion();
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
......
...@@ -23,7 +23,6 @@ import javax.imageio.stream.FileImageOutputStream; ...@@ -23,7 +23,6 @@ import javax.imageio.stream.FileImageOutputStream;
import org.h2.mvstore.MVStore; import org.h2.mvstore.MVStore;
import org.h2.mvstore.rtree.MVRTreeMap; import org.h2.mvstore.rtree.MVRTreeMap;
import org.h2.mvstore.rtree.SpatialKey; import org.h2.mvstore.rtree.SpatialKey;
import org.h2.mvstore.type.ObjectDataType;
import org.h2.mvstore.type.StringDataType; import org.h2.mvstore.type.StringDataType;
import org.h2.store.fs.FileUtils; import org.h2.store.fs.FileUtils;
import org.h2.test.TestBase; import org.h2.test.TestBase;
...@@ -54,12 +53,9 @@ public class TestMVRTree extends TestMVStore { ...@@ -54,12 +53,9 @@ public class TestMVRTree extends TestMVStore {
// create an in-memory store // create an in-memory store
MVStore s = MVStore.open(null); MVStore s = MVStore.open(null);
// create an R-tree map // open an R-tree map
// the key has 2 dimensions, the value is a string MVRTreeMap<String> r = s.openMap("data",
MVRTreeMap<String> r = MVRTreeMap.create(2, new ObjectDataType()); new MVRTreeMap.Builder<String>());
// open the map
r = s.openMap("data", r);
// add two key-value pairs // add two key-value pairs
// the first value is the key id (to make the key unique) // the first value is the key id (to make the key unique)
...@@ -84,8 +80,9 @@ public class TestMVRTree extends TestMVStore { ...@@ -84,8 +80,9 @@ public class TestMVRTree extends TestMVStore {
MVStore s; MVStore s;
s = openStore(fileName); s = openStore(fileName);
// s.setMaxPageSize(50); // s.setMaxPageSize(50);
MVRTreeMap<String> r = MVRTreeMap.create(2, StringDataType.INSTANCE); MVRTreeMap<String> r = s.openMap("data",
r = s.openMap("data", r); new MVRTreeMap.Builder<String>().dimensions(2).
valueType(StringDataType.INSTANCE));
// r.setQuadraticSplit(true); // r.setQuadraticSplit(true);
Random rand = new Random(1); Random rand = new Random(1);
int len = 1000; int len = 1000;
...@@ -109,8 +106,9 @@ public class TestMVRTree extends TestMVStore { ...@@ -109,8 +106,9 @@ public class TestMVRTree extends TestMVStore {
s.store(); s.store();
s.close(); s.close();
s = openStore(fileName); s = openStore(fileName);
r = MVRTreeMap.create(2, StringDataType.INSTANCE); r = s.openMap("data",
r = s.openMap("data", r); new MVRTreeMap.Builder<String>().dimensions(2).
valueType(StringDataType.INSTANCE));
// t = System.currentTimeMillis(); // t = System.currentTimeMillis();
rand = new Random(1); rand = new Random(1);
for (int i = 0; i < len; i++) { for (int i = 0; i < len; i++) {
...@@ -148,8 +146,10 @@ public class TestMVRTree extends TestMVStore { ...@@ -148,8 +146,10 @@ public class TestMVRTree extends TestMVStore {
FileUtils.delete(fileName); FileUtils.delete(fileName);
MVStore s; MVStore s;
s = openStore(fileName); s = openStore(fileName);
MVRTreeMap<String> r = MVRTreeMap.create(2, StringDataType.INSTANCE); MVRTreeMap<String> r = s.openMap("data",
r = s.openMap("data", r); new MVRTreeMap.Builder<String>().dimensions(2).
valueType(StringDataType.INSTANCE));
add(r, "Bern", key(0, 46.57, 7.27, 124381)); add(r, "Bern", key(0, 46.57, 7.27, 124381));
add(r, "Basel", key(1, 47.34, 7.36, 170903)); add(r, "Basel", key(1, 47.34, 7.36, 170903));
add(r, "Zurich", key(2, 47.22, 8.33, 376008)); add(r, "Zurich", key(2, 47.22, 8.33, 376008));
...@@ -273,9 +273,11 @@ public class TestMVRTree extends TestMVStore { ...@@ -273,9 +273,11 @@ public class TestMVRTree extends TestMVStore {
String fileName = getBaseDir() + "/testRandom.h3"; String fileName = getBaseDir() + "/testRandom.h3";
FileUtils.delete(fileName); FileUtils.delete(fileName);
MVStore s = openStore(fileName); MVStore s = openStore(fileName);
MVRTreeMap<String> m = MVRTreeMap.create(2, StringDataType.INSTANCE);
MVRTreeMap<String> m = s.openMap("data",
new MVRTreeMap.Builder<String>());
m.setQuadraticSplit(quadraticSplit); m.setQuadraticSplit(quadraticSplit);
m = s.openMap("data", m);
HashMap<SpatialKey, String> map = new HashMap<SpatialKey, String>(); HashMap<SpatialKey, String> map = new HashMap<SpatialKey, String>();
Random rand = new Random(1); Random rand = new Random(1);
int operationCount = 1000; int operationCount = 1000;
......
...@@ -91,8 +91,7 @@ public class TestMVStore extends TestBase { ...@@ -91,8 +91,7 @@ public class TestMVStore extends TestBase {
String fileName = getBaseDir() + "/testMapType.h3"; String fileName = getBaseDir() + "/testMapType.h3";
FileUtils.delete(fileName); FileUtils.delete(fileName);
MVStore s = openStore(fileName); MVStore s = openStore(fileName);
SequenceMap seq = new SequenceMap(); SequenceMap seq = s.openMap("data", new SequenceMap.Builder());
seq = s.openMap("data", seq);
StringBuilder buff = new StringBuilder(); StringBuilder buff = new StringBuilder();
for (long x : seq.keySet()) { for (long x : seq.keySet()) {
buff.append(x).append(';'); buff.append(x).append(';');
...@@ -455,8 +454,7 @@ public class TestMVStore extends TestBase { ...@@ -455,8 +454,7 @@ public class TestMVStore extends TestBase {
// long t = System.currentTimeMillis(); // long t = System.currentTimeMillis();
for (int j = 0; j < 3; j++) { for (int j = 0; j < 3; j++) {
MVStore s = openStore(fileName); MVStore s = openStore(fileName);
Map<String, Integer> m = s.openMap("data", String.class, Map<String, Integer> m = s.openMap("data");
Integer.class);
for (int i = 0; i < 3; i++) { for (int i = 0; i < 3; i++) {
Integer x = m.get("value"); Integer x = m.get("value");
m.put("value", x == null ? 0 : x + 1); m.put("value", x == null ? 0 : x + 1);
...@@ -474,7 +472,7 @@ public class TestMVStore extends TestBase { ...@@ -474,7 +472,7 @@ public class TestMVStore extends TestBase {
FileUtils.delete(fileName); FileUtils.delete(fileName);
MVStore s = openStore(fileName); MVStore s = openStore(fileName);
s.setPageSize(6); s.setPageSize(6);
MVMap<Integer, String> m = s.openMap("data", Integer.class, String.class); MVMap<Integer, String> m = s.openMap("data");
for (int i = 0; i < 100; i++) { for (int i = 0; i < 100; i++) {
m.put(i, "Hi"); m.put(i, "Hi");
} }
...@@ -508,7 +506,7 @@ public class TestMVStore extends TestBase { ...@@ -508,7 +506,7 @@ public class TestMVStore extends TestBase {
MVStore s; MVStore s;
s = openStore(fileName); s = openStore(fileName);
MVMap<String, String> m; MVMap<String, String> m;
m = s.openMap("data", String.class, String.class); m = s.openMap("data");
long first = s.getCurrentVersion(); long first = s.getCurrentVersion();
s.incrementVersion(); s.incrementVersion();
m.put("1", "Hello"); m.put("1", "Hello");
...@@ -547,7 +545,7 @@ public class TestMVStore extends TestBase { ...@@ -547,7 +545,7 @@ public class TestMVStore extends TestBase {
s.close(); s.close();
s = openStore(fileName); s = openStore(fileName);
m = s.openMap("data", String.class, String.class); m = s.openMap("data");
assertEquals("Hi", m.get("1")); assertEquals("Hi", m.get("1"));
assertEquals(null, m.get("2")); assertEquals(null, m.get("2"));
...@@ -563,7 +561,7 @@ public class TestMVStore extends TestBase { ...@@ -563,7 +561,7 @@ public class TestMVStore extends TestBase {
MVStore s; MVStore s;
MVMap<Integer, String> m; MVMap<Integer, String> m;
s = openStore(fileName); s = openStore(fileName);
m = s.openMap("data", Integer.class, String.class); m = s.openMap("data");
for (int i = 0; i < 1000; i++) { for (int i = 0; i < 1000; i++) {
m.put(i, "Hello World"); m.put(i, "Hello World");
} }
...@@ -572,7 +570,7 @@ public class TestMVStore extends TestBase { ...@@ -572,7 +570,7 @@ public class TestMVStore extends TestBase {
long len = FileUtils.size(fileName); long len = FileUtils.size(fileName);
s = openStore(fileName); s = openStore(fileName);
s.setRetentionTime(0); s.setRetentionTime(0);
m = s.openMap("data", Integer.class, String.class); m = s.openMap("data");
m.clear(); m.clear();
s.store(); s.store();
s.compact(100); s.compact(100);
...@@ -588,7 +586,7 @@ public class TestMVStore extends TestBase { ...@@ -588,7 +586,7 @@ public class TestMVStore extends TestBase {
MVMap<Integer, String> m; MVMap<Integer, String> m;
s = openStore(fileName); s = openStore(fileName);
s.setPageSize(700); s.setPageSize(700);
m = s.openMap("data", Integer.class, String.class); m = s.openMap("data");
for (int i = 0; i < 1000; i++) { for (int i = 0; i < 1000; i++) {
m.put(i, "Hello World"); m.put(i, "Hello World");
assertEquals(i + 1, m.size()); assertEquals(i + 1, m.size());
...@@ -600,7 +598,7 @@ public class TestMVStore extends TestBase { ...@@ -600,7 +598,7 @@ public class TestMVStore extends TestBase {
s.close(); s.close();
s = openStore(fileName); s = openStore(fileName);
m = s.openMap("data", Integer.class, String.class); m = s.openMap("data");
m.clear(); m.clear();
assertEquals(0, m.size()); assertEquals(0, m.size());
s.store(); s.store();
...@@ -622,9 +620,9 @@ public class TestMVStore extends TestBase { ...@@ -622,9 +620,9 @@ public class TestMVStore extends TestBase {
assertEquals(45, s.getRetentionTime()); assertEquals(45, s.getRetentionTime());
assertEquals(0, s.getCurrentVersion()); assertEquals(0, s.getCurrentVersion());
assertFalse(s.hasUnsavedChanges()); assertFalse(s.hasUnsavedChanges());
MVMap<String, String> m = s.openMap("data", String.class, String.class); MVMap<String, String> m = s.openMap("data");
assertTrue(s.hasUnsavedChanges()); assertTrue(s.hasUnsavedChanges());
MVMap<String, String> m0 = s.openMap("data0", String.class, String.class); MVMap<String, String> m0 = s.openMap("data0");
m.put("1", "Hello"); m.put("1", "Hello");
assertEquals(1, s.incrementVersion()); assertEquals(1, s.incrementVersion());
s.rollbackTo(1); s.rollbackTo(1);
...@@ -638,9 +636,9 @@ public class TestMVStore extends TestBase { ...@@ -638,9 +636,9 @@ public class TestMVStore extends TestBase {
s = openStore(fileName); s = openStore(fileName);
assertEquals(2, s.getCurrentVersion()); assertEquals(2, s.getCurrentVersion());
meta = s.getMetaMap(); meta = s.getMetaMap();
m = s.openMap("data", String.class, String.class); m = s.openMap("data");
m0 = s.openMap("data0", String.class, String.class); m0 = s.openMap("data0");
MVMap<String, String> m1 = s.openMap("data1", String.class, String.class); MVMap<String, String> m1 = s.openMap("data1");
m.put("1", "Hallo"); m.put("1", "Hallo");
m0.put("1", "Hallo"); m0.put("1", "Hallo");
m1.put("1", "Hallo"); m1.put("1", "Hallo");
...@@ -661,8 +659,8 @@ public class TestMVStore extends TestBase { ...@@ -661,8 +659,8 @@ public class TestMVStore extends TestBase {
assertTrue(meta.get("name.data") != null); assertTrue(meta.get("name.data") != null);
assertTrue(meta.get("name.data0") != null); assertTrue(meta.get("name.data0") != null);
assertNull(meta.get("name.data1")); assertNull(meta.get("name.data1"));
m = s.openMap("data", String.class, String.class); m = s.openMap("data");
m0 = s.openMap("data0", String.class, String.class); m0 = s.openMap("data0");
assertNull(m0.get("1")); assertNull(m0.get("1"));
assertEquals("Hello", m.get("1")); assertEquals("Hello", m.get("1"));
assertFalse(m0.isReadOnly()); assertFalse(m0.isReadOnly());
...@@ -677,20 +675,20 @@ public class TestMVStore extends TestBase { ...@@ -677,20 +675,20 @@ public class TestMVStore extends TestBase {
s = openStore(fileName); s = openStore(fileName);
assertEquals(4, s.getCurrentVersion()); assertEquals(4, s.getCurrentVersion());
m = s.openMap("data", String.class, String.class); m = s.openMap("data");
m.put("1", "Hi"); m.put("1", "Hi");
s.store(); s.store();
s.close(); s.close();
s = openStore(fileName); s = openStore(fileName);
m = s.openMap("data", String.class, String.class); m = s.openMap("data");
assertEquals("Hi", m.get("1")); assertEquals("Hi", m.get("1"));
s.rollbackTo(v4); s.rollbackTo(v4);
assertEquals("Hallo", m.get("1")); assertEquals("Hallo", m.get("1"));
s.close(); s.close();
s = openStore(fileName); s = openStore(fileName);
m = s.openMap("data", String.class, String.class); m = s.openMap("data");
assertEquals("Hallo", m.get("1")); assertEquals("Hallo", m.get("1"));
s.close(); s.close();
} }
...@@ -701,14 +699,14 @@ public class TestMVStore extends TestBase { ...@@ -701,14 +699,14 @@ public class TestMVStore extends TestBase {
MVStore s = openStore(fileName); MVStore s = openStore(fileName);
assertEquals(0, s.getCurrentVersion()); assertEquals(0, s.getCurrentVersion());
s.setPageSize(5); s.setPageSize(5);
MVMap<String, String> m = s.openMap("data", String.class, String.class); MVMap<String, String> m = s.openMap("data");
s.rollbackTo(0); s.rollbackTo(0);
assertTrue(m.isClosed()); assertTrue(m.isClosed());
assertEquals(0, s.getCurrentVersion()); assertEquals(0, s.getCurrentVersion());
m = s.openMap("data", String.class, String.class); m = s.openMap("data");
MVMap<String, String> m0 = s.openMap("data0", String.class, String.class); MVMap<String, String> m0 = s.openMap("data0");
MVMap<String, String> m2 = s.openMap("data2", String.class, String.class); MVMap<String, String> m2 = s.openMap("data2");
m.put("1", "Hello"); m.put("1", "Hello");
for (int i = 0; i < 10; i++) { for (int i = 0; i < 10; i++) {
m2.put("" + i, "Test"); m2.put("" + i, "Test");
...@@ -716,7 +714,7 @@ public class TestMVStore extends TestBase { ...@@ -716,7 +714,7 @@ public class TestMVStore extends TestBase {
long v1 = s.incrementVersion(); long v1 = s.incrementVersion();
assertEquals(1, v1); assertEquals(1, v1);
assertEquals(1, s.getCurrentVersion()); assertEquals(1, s.getCurrentVersion());
MVMap<String, String> m1 = s.openMap("data1", String.class, String.class); MVMap<String, String> m1 = s.openMap("data1");
assertEquals("Test", m2.get("1")); assertEquals("Test", m2.get("1"));
m.put("1", "Hallo"); m.put("1", "Hallo");
m0.put("1", "Hallo"); m0.put("1", "Hallo");
...@@ -742,7 +740,7 @@ public class TestMVStore extends TestBase { ...@@ -742,7 +740,7 @@ public class TestMVStore extends TestBase {
FileUtils.delete(fileName); FileUtils.delete(fileName);
MVStore s = openStore(fileName); MVStore s = openStore(fileName);
MVMap<String, String> m = s.getMetaMap(); MVMap<String, String> m = s.getMetaMap();
MVMap<String, String> data = s.openMap("data", String.class, String.class); MVMap<String, String> data = s.openMap("data");
data.put("1", "Hello"); data.put("1", "Hello");
data.put("2", "World"); data.put("2", "World");
s.store(); s.store();
...@@ -751,15 +749,15 @@ public class TestMVStore extends TestBase { ...@@ -751,15 +749,15 @@ public class TestMVStore extends TestBase {
assertFalse(m.containsKey("chunk.2")); assertFalse(m.containsKey("chunk.2"));
String id = s.getMetaMap().get("name.data"); String id = s.getMetaMap().get("name.data");
assertEquals("name:data", m.get("map." + id)); assertEquals("name:data,key:o,value:o", m.get("map." + id));
assertTrue(m.containsKey("chunk.1")); assertTrue(m.containsKey("chunk.1"));
assertEquals("Hello", data.put("1", "Hallo")); assertEquals("Hello", data.put("1", "Hallo"));
s.store(); s.store();
assertEquals("name:data", m.get("map." + id)); assertEquals("name:data,key:o,value:o", m.get("map." + id));
assertTrue(m.get("root.1").length() > 0); assertTrue(m.get("root.1").length() > 0);
assertTrue(m.containsKey("chunk.1")); assertTrue(m.containsKey("chunk.1"));
assertEquals("id:1,length:246,maxLength:224,maxLengthLive:0," + assertEquals("id:1,length:260,maxLength:288,maxLengthLive:0," +
"metaRoot:274877910922,pageCount:2," + "metaRoot:274877910924,pageCount:2," +
"start:8192,time:0,version:1", m.get("chunk.1")); "start:8192,time:0,version:1", m.get("chunk.1"));
assertTrue(m.containsKey("chunk.2")); assertTrue(m.containsKey("chunk.2"));
...@@ -782,7 +780,7 @@ public class TestMVStore extends TestBase { ...@@ -782,7 +780,7 @@ public class TestMVStore extends TestBase {
int len = 100; int len = 100;
// TreeMap<Integer, String> m = new TreeMap<Integer, String>(); // TreeMap<Integer, String> m = new TreeMap<Integer, String>();
// HashMap<Integer, String> m = New.hashMap(); // HashMap<Integer, String> m = New.hashMap();
MVMap<Integer, String> m = s.openMap("data", Integer.class, String.class); MVMap<Integer, String> m = s.openMap("data");
// t = System.currentTimeMillis(); // t = System.currentTimeMillis();
for (int i = 0; i < len; i++) { for (int i = 0; i < len; i++) {
assertNull(m.put(i, "Hello World")); assertNull(m.put(i, "Hello World"));
...@@ -813,16 +811,13 @@ public class TestMVStore extends TestBase { ...@@ -813,16 +811,13 @@ public class TestMVStore extends TestBase {
MVStore s = openStore(fileName); MVStore s = openStore(fileName);
// s.setCompressor(null); // s.setCompressor(null);
s.setPageSize(40); s.setPageSize(40);
MVMap<Integer, Object[]> m = new MVMap<Integer, Object[]>( MVMap<Integer, Object[]> m = s.openMap("data",
new ObjectDataType(), new MVMap.Builder<Integer, Object[]>()
new RowDataType(new DataType[] { .valueType(new RowDataType(new DataType[] {
new ObjectDataType(), new ObjectDataType(),
StringDataType.INSTANCE, StringDataType.INSTANCE,
StringDataType.INSTANCE StringDataType.INSTANCE })));
})
);
m = s.openMap("data", m);
// Profiler prof = new Profiler(); // Profiler prof = new Profiler();
// prof.startCollecting(); // prof.startCollecting();
// long t = System.currentTimeMillis(); // long t = System.currentTimeMillis();
...@@ -852,7 +847,7 @@ public class TestMVStore extends TestBase { ...@@ -852,7 +847,7 @@ public class TestMVStore extends TestBase {
s.close(); s.close();
s = openStore(fileName); s = openStore(fileName);
MVMap<Integer, String> m = s.openMap("data", Integer.class, String.class); MVMap<Integer, String> m = s.openMap("data");
int count = 2000; int count = 2000;
// Profiler p = new Profiler(); // Profiler p = new Profiler();
// p.startCollecting(); // p.startCollecting();
...@@ -878,7 +873,7 @@ public class TestMVStore extends TestBase { ...@@ -878,7 +873,7 @@ public class TestMVStore extends TestBase {
s.close(); s.close();
s = openStore(fileName); s = openStore(fileName);
m = s.openMap("data", Integer.class, String.class); m = s.openMap("data");
assertNull(m.get(0)); assertNull(m.get(0));
for (int i = 1; i < count; i++) { for (int i = 1; i < count; i++) {
assertEquals("hello " + i, m.get(i)); assertEquals("hello " + i, m.get(i));
...@@ -901,7 +896,7 @@ public class TestMVStore extends TestBase { ...@@ -901,7 +896,7 @@ public class TestMVStore extends TestBase {
for (int j = 0; j < 20; j++) { for (int j = 0; j < 20; j++) {
MVStore s = openStore(fileName); MVStore s = openStore(fileName);
s.setRetentionTime(0); s.setRetentionTime(0);
MVMap<Integer, String> m = s.openMap("data", Integer.class, String.class); MVMap<Integer, String> m = s.openMap("data");
for (int i = 0; i < 100; i++) { for (int i = 0; i < 100; i++) {
m.put(j + i, "Hello " + j); m.put(j + i, "Hello " + j);
} }
...@@ -919,7 +914,7 @@ public class TestMVStore extends TestBase { ...@@ -919,7 +914,7 @@ public class TestMVStore extends TestBase {
// long len = FileUtils.size(fileName); // long len = FileUtils.size(fileName);
// System.out.println("len0: " + len); // System.out.println("len0: " + len);
MVStore s = openStore(fileName); MVStore s = openStore(fileName);
MVMap<Integer, String> m = s.openMap("data", Integer.class, String.class); MVMap<Integer, String> m = s.openMap("data");
for (int i = 0; i < 100; i++) { for (int i = 0; i < 100; i++) {
m.remove(i); m.remove(i);
} }
...@@ -929,7 +924,7 @@ public class TestMVStore extends TestBase { ...@@ -929,7 +924,7 @@ public class TestMVStore extends TestBase {
// len = FileUtils.size(fileName); // len = FileUtils.size(fileName);
// System.out.println("len1: " + len); // System.out.println("len1: " + len);
s = openStore(fileName); s = openStore(fileName);
m = s.openMap("data", Integer.class, String.class); m = s.openMap("data");
s.compact(80); s.compact(80);
s.close(); s.close();
// len = FileUtils.size(fileName); // len = FileUtils.size(fileName);
...@@ -943,7 +938,7 @@ public class TestMVStore extends TestBase { ...@@ -943,7 +938,7 @@ public class TestMVStore extends TestBase {
for (int j = 0; j < 20; j++) { for (int j = 0; j < 20; j++) {
MVStore s = openStore(fileName); MVStore s = openStore(fileName);
s.setRetentionTime(0); s.setRetentionTime(0);
MVMap<Integer, String> m = s.openMap("data", Integer.class, String.class); MVMap<Integer, String> m = s.openMap("data");
for (int i = 0; i < 10; i++) { for (int i = 0; i < 10; i++) {
m.put(i, "Hello"); m.put(i, "Hello");
} }
...@@ -968,7 +963,7 @@ public class TestMVStore extends TestBase { ...@@ -968,7 +963,7 @@ public class TestMVStore extends TestBase {
String fileName = getBaseDir() + "/testRandom.h3"; String fileName = getBaseDir() + "/testRandom.h3";
FileUtils.delete(fileName); FileUtils.delete(fileName);
MVStore s = openStore(fileName); MVStore s = openStore(fileName);
MVMap<Integer, Integer> m = s.openMap("data", Integer.class, Integer.class); MVMap<Integer, Integer> m = s.openMap("data");
TreeMap<Integer, Integer> map = new TreeMap<Integer, Integer>(); TreeMap<Integer, Integer> map = new TreeMap<Integer, Integer>();
Random r = new Random(1); Random r = new Random(1);
int operationCount = 1000; int operationCount = 1000;
...@@ -1031,24 +1026,24 @@ public class TestMVStore extends TestBase { ...@@ -1031,24 +1026,24 @@ public class TestMVStore extends TestBase {
String fileName = getBaseDir() + "/testKeyValueClasses.h3"; String fileName = getBaseDir() + "/testKeyValueClasses.h3";
FileUtils.delete(fileName); FileUtils.delete(fileName);
MVStore s = openStore(fileName); MVStore s = openStore(fileName);
MVMap<Integer, String> is = s.openMap("intString", Integer.class, String.class); MVMap<Integer, String> is = s.openMap("intString");
is.put(1, "Hello"); is.put(1, "Hello");
MVMap<Integer, Integer> ii = s.openMap("intInt", Integer.class, Integer.class); MVMap<Integer, Integer> ii = s.openMap("intInt");
ii.put(1, 10); ii.put(1, 10);
MVMap<String, Integer> si = s.openMap("stringInt", String.class, Integer.class); MVMap<String, Integer> si = s.openMap("stringInt");
si.put("Test", 10); si.put("Test", 10);
MVMap<String, String> ss = s.openMap("stringString", String.class, String.class); MVMap<String, String> ss = s.openMap("stringString");
ss.put("Hello", "World"); ss.put("Hello", "World");
s.store(); s.store();
s.close(); s.close();
s = openStore(fileName); s = openStore(fileName);
is = s.openMap("intString", Integer.class, String.class); is = s.openMap("intString");
assertEquals("Hello", is.get(1)); assertEquals("Hello", is.get(1));
ii = s.openMap("intInt", Integer.class, Integer.class); ii = s.openMap("intInt");
assertEquals(10, ii.get(1).intValue()); assertEquals(10, ii.get(1).intValue());
si = s.openMap("stringInt", String.class, Integer.class); si = s.openMap("stringInt");
assertEquals(10, si.get("Test").intValue()); assertEquals(10, si.get("Test").intValue());
ss = s.openMap("stringString", String.class, String.class); ss = s.openMap("stringString");
assertEquals("World", ss.get("Hello")); assertEquals("World", ss.get("Hello"));
s.close(); s.close();
} }
...@@ -1057,7 +1052,7 @@ public class TestMVStore extends TestBase { ...@@ -1057,7 +1052,7 @@ public class TestMVStore extends TestBase {
String fileName = getBaseDir() + "/testIterate.h3"; String fileName = getBaseDir() + "/testIterate.h3";
FileUtils.delete(fileName); FileUtils.delete(fileName);
MVStore s = openStore(fileName); MVStore s = openStore(fileName);
MVMap<Integer, String> m = s.openMap("data", Integer.class, String.class); MVMap<Integer, String> m = s.openMap("data");
Iterator<Integer> it = m.keyIterator(null); Iterator<Integer> it = m.keyIterator(null);
assertFalse(it.hasNext()); assertFalse(it.hasNext());
for (int i = 0; i < 10; i++) { for (int i = 0; i < 10; i++) {
...@@ -1090,7 +1085,7 @@ public class TestMVStore extends TestBase { ...@@ -1090,7 +1085,7 @@ public class TestMVStore extends TestBase {
String fileName = getBaseDir() + "/testCloseTwice.h3"; String fileName = getBaseDir() + "/testCloseTwice.h3";
FileUtils.delete(fileName); FileUtils.delete(fileName);
MVStore s = openStore(fileName); MVStore s = openStore(fileName);
MVMap<Integer, String> m = s.openMap("data", Integer.class, String.class); MVMap<Integer, String> m = s.openMap("data");
for (int i = 0; i < 3; i++) { for (int i = 0; i < 3; i++) {
m.put(i, "hello " + i); m.put(i, "hello " + i);
} }
...@@ -1104,7 +1099,7 @@ public class TestMVStore extends TestBase { ...@@ -1104,7 +1099,7 @@ public class TestMVStore extends TestBase {
String fileName = getBaseDir() + "/testSimple.h3"; String fileName = getBaseDir() + "/testSimple.h3";
FileUtils.delete(fileName); FileUtils.delete(fileName);
MVStore s = openStore(fileName); MVStore s = openStore(fileName);
MVMap<Integer, String> m = s.openMap("data", Integer.class, String.class); MVMap<Integer, String> m = s.openMap("data");
for (int i = 0; i < 3; i++) { for (int i = 0; i < 3; i++) {
m.put(i, "hello " + i); m.put(i, "hello " + i);
} }
...@@ -1119,7 +1114,7 @@ public class TestMVStore extends TestBase { ...@@ -1119,7 +1114,7 @@ public class TestMVStore extends TestBase {
s.close(); s.close();
s = openStore(fileName); s = openStore(fileName);
m = s.openMap("data", Integer.class, String.class); m = s.openMap("data");
assertNull(m.get(0)); assertNull(m.get(0));
for (int i = 1; i < 3; i++) { for (int i = 1; i < 3; i++) {
assertEquals("hello " + i, m.get(i)); assertEquals("hello " + i, m.get(i));
......
...@@ -28,7 +28,7 @@ public class TestMVTableEngine extends TestBase { ...@@ -28,7 +28,7 @@ public class TestMVTableEngine extends TestBase {
} }
public void test() throws Exception { public void test() throws Exception {
// testCase(); testCase();
testSimple(); testSimple();
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论