You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@labs.apache.org by ka...@apache.org on 2009/03/23 00:41:38 UTC
svn commit: r757279 - in /labs/bananadb/trunk/src:
main/java/org/apache/labs/bananadb/entity/
main/java/org/apache/labs/bananadb/store/
main/java/org/apache/labs/bananadb/store/sequence/
test/java/org/apache/labs/bananadb/entity/ test/java/org/apache/l...
Author: kalle
Date: Sun Mar 22 23:41:38 2009
New Revision: 757279
URL: http://svn.apache.org/viewvc?rev=757279&view=rev
Log:
Banana DB
Auto incrementing primary keys demonstraded in test using dummy sequence manager.
Removed:
labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/entity/Sequence.java
Modified:
labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/entity/EntityStore.java
labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/entity/PrimaryIndex.java
labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/store/Store.java
labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/store/sequence/SequenceManager.java
labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/store/sequence/StaticSequenceManager.java
labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/entity/TestEntityStore.java
labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/store/StoreTest.java
Modified: labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/entity/EntityStore.java
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/entity/EntityStore.java?rev=757279&r1=757278&r2=757279&view=diff
==============================================================================
--- labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/entity/EntityStore.java (original)
+++ labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/entity/EntityStore.java Sun Mar 22 23:41:38 2009
@@ -23,7 +23,7 @@
import org.apache.labs.bananadb.entity.serialization.Unmarshaller;
import org.apache.labs.bananadb.entity.Transaction;
import org.apache.labs.bananadb.store.*;
-import org.apache.labs.bananadb.store.Configuration;
+import org.apache.labs.bananadb.store.sequence.SequenceManager;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
@@ -71,7 +71,7 @@
Method primaryKeyGetter;
Method primaryKeySetter;
- Sequence primaryKeySequence;
+ SequenceManager.Sequence<PK> primaryKeySequence;
{
List<Field> pkFields = new ArrayList<Field>();
for (Field field : entityClass.getDeclaredFields()) {
@@ -108,9 +108,9 @@
}
PrimaryKey primaryKey = primaryKeyField.getAnnotation(PrimaryKey.class);
if ("[unassigned]".equals(primaryKey.sequence())) {
- primaryKeySequence = new Sequence(this, entityClass.getName());
+ primaryKeySequence = getSequenceManager().getOrRegisterSequence(keyClass, primaryKey.sequence());
} else {
- primaryKeySequence = new Sequence(this, primaryKey.sequence());
+ primaryKeySequence = getSequenceManager().getOrRegisterSequence(keyClass, primaryKey.sequence());
}
}
Modified: labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/entity/PrimaryIndex.java
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/entity/PrimaryIndex.java?rev=757279&r1=757278&r2=757279&view=diff
==============================================================================
--- labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/entity/PrimaryIndex.java (original)
+++ labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/entity/PrimaryIndex.java Sun Mar 22 23:41:38 2009
@@ -4,6 +4,7 @@
import org.apache.labs.bananadb.entity.serialization.Marshaller;
import org.apache.labs.bananadb.entity.serialization.Unmarshaller;
import org.apache.labs.bananadb.store.Accessor;
+import org.apache.labs.bananadb.store.sequence.SequenceManager;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
@@ -50,9 +51,9 @@
private Method primaryKeyGetter;
private Method primaryKeySetter;
- private Sequence<K> primaryKeySequence;
+ private SequenceManager.Sequence<K> primaryKeySequence;
- public PrimaryIndex(EntityStore entityStore, Sequence<K> primaryKeySequence, Method primaryKeyGetter, Method primaryKeySetter, Class<K> keyClass, Class<E> entityClass, Marshaller keyMarshaller, Unmarshaller keyUnmarshaller, HashCodeCalculator keyHashCodeCalculator, Marshaller entityMarshaller, Unmarshaller entityUnmarshaller) {
+ public PrimaryIndex(EntityStore entityStore, SequenceManager.Sequence<K> primaryKeySequence, Method primaryKeyGetter, Method primaryKeySetter, Class<K> keyClass, Class<E> entityClass, Marshaller keyMarshaller, Unmarshaller keyUnmarshaller, HashCodeCalculator keyHashCodeCalculator, Marshaller entityMarshaller, Unmarshaller entityUnmarshaller) {
this.entityStore = entityStore;
this.primaryKeySequence = primaryKeySequence;
@@ -181,7 +182,7 @@
return entityStore;
}
- public Sequence<K> getPrimaryKeySequence() {
+ public SequenceManager.Sequence<K> getPrimaryKeySequence() {
return primaryKeySequence;
}
@@ -307,6 +308,10 @@
K key = getPrimaryKey(entity);
+ if (key == null) {
+ setPrimaryKey(entity, key = primaryKeySequence.next());
+ }
+
CachedKey cachedKey = new CachedKey(key);
CachedEntity cachedEntity = new CachedEntity(entity);
Modified: labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/store/Store.java
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/store/Store.java?rev=757279&r1=757278&r2=757279&view=diff
==============================================================================
--- labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/store/Store.java (original)
+++ labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/store/Store.java Sun Mar 22 23:41:38 2009
@@ -36,6 +36,8 @@
import java.util.NoSuchElementException;
/**
+ * todo make sure deleted postings are the last postings in all hash code chains!
+ *
* @author kalle
* @since 2009-mar-16 15:34:56
*/
Modified: labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/store/sequence/SequenceManager.java
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/store/sequence/SequenceManager.java?rev=757279&r1=757278&r2=757279&view=diff
==============================================================================
--- labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/store/sequence/SequenceManager.java (original)
+++ labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/store/sequence/SequenceManager.java Sun Mar 22 23:41:38 2009
@@ -1,5 +1,7 @@
package org.apache.labs.bananadb.store.sequence;
+import java.io.IOException;
+
/**
* @author kalle
* @since 2009-mar-22 15:03:35
@@ -8,7 +10,7 @@
public abstract SequenceManager.Sequence.ReservedSequenceRange reserve(String name, int requestedSize);
- public abstract void register(Sequence sequence);
+ public abstract <T> Sequence<T> getOrRegisterSequence(Class<T> valueType, String name);
public abstract <T> Sequence<T> sequenceFactory(Class<T> valueType, String name);
@@ -24,6 +26,10 @@
return name;
}
+ public T next() throws IOException {
+ return reserve(1).nextValue();
+ }
+
public abstract Class<T> getValueType();
public abstract ReservedSequenceRange<T> reserve(int requestedSize);
protected abstract void release(ReservedSequenceRange<T> reservation);
Modified: labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/store/sequence/StaticSequenceManager.java
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/store/sequence/StaticSequenceManager.java?rev=757279&r1=757278&r2=757279&view=diff
==============================================================================
--- labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/store/sequence/StaticSequenceManager.java (original)
+++ labs/bananadb/trunk/src/main/java/org/apache/labs/bananadb/store/sequence/StaticSequenceManager.java Sun Mar 22 23:41:38 2009
@@ -19,18 +19,19 @@
return sequences.get(name).reserve(requestedSize);
}
- public void register(Sequence sequence) {
- Sequence old = sequences.get(sequence.getName());
- if (old != null) {
- throw new RuntimeException("Already contains a sequence with that name: " + sequence.toString());
+ @SuppressWarnings("unchecked")
+ public <T> Sequence<T> getOrRegisterSequence(Class<T> valueType, String name) {
+ Sequence<T> sequence = sequences.get(name);
+ if (sequence == null) {
+ sequences.put(name, sequence = sequenceFactory(valueType, name));
}
- sequences.put(sequence.getName(), sequence);
+ return sequence;
}
@SuppressWarnings("unchecked")
public <T> Sequence<T> sequenceFactory(Class<T> valueType, String name) {
if (valueType == Long.class) {
- return (Sequence<T>) new LongSequence(name);
+ return (Sequence<T>) new LongSequence(name);
}
throw new UnsupportedOperationException("Unregistred value type class " + valueType.getName());
}
@@ -41,15 +42,19 @@
super(name);
}
- private AtomicLong value = new AtomicLong();
+ private AtomicLong value = new AtomicLong(0);
public Class<Long> getValueType() {
return Long.class;
}
public ReservedSequenceRange<Long> reserve(int requestedSize) {
- long start = value.addAndGet(requestedSize);
- return new LongRange(start, start + requestedSize);
+ if (!"on".equalsIgnoreCase(System.getProperty("bananadb.never.turn.this.on", "off"))) {
+ throw new RuntimeException("This is the dummy sequence manager, used only for test cases! Values are not stored and has limited features. To turn it off, set system property bananadb.never.turn.this.on=on");
+ } else {
+ long start = value.getAndAdd(requestedSize);
+ return new LongRange(start, start + requestedSize);
+ }
}
protected void release(ReservedSequenceRange<Long> reservation) {
Modified: labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/entity/TestEntityStore.java
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/entity/TestEntityStore.java?rev=757279&r1=757278&r2=757279&view=diff
==============================================================================
--- labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/entity/TestEntityStore.java (original)
+++ labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/entity/TestEntityStore.java Sun Mar 22 23:41:38 2009
@@ -30,9 +30,36 @@
public class TestEntityStore extends StoreTest {
@Test
+ public void testAutoIncrement() throws Exception {
+
+ EntityStore store = new EntityStore(getDirectory("entityStore/testAutoIncrement"));
+ store.getConfiguration().setValuesPartitionByteSize(10 * Configuration.megaByte);
+ store.getConfiguration().setKeysPartitionByteSize(1 * Configuration.megaByte);
+ store.getConfiguration().setHashCodesPartitionByteSize(1 * Configuration.megaByte);
+
+ PrimaryIndex<Long, WithSharedSequenceNameA> withSharedSequenceNamesA = store.getPrimaryIndex(Long.class, WithSharedSequenceNameA.class);
+ PrimaryIndex<Long, WithSharedSequenceNameB> withSharedSequenceNamesB = store.getPrimaryIndex(Long.class, WithSharedSequenceNameB.class);
+
+ store.getTxn().begin();
+
+ WithSharedSequenceNameA a;
+ WithSharedSequenceNameB b;
+ withSharedSequenceNamesA.put(a = new WithSharedSequenceNameA());
+ assertEquals(new Long(1l), a.getPK());
+ withSharedSequenceNamesB.put(b = new WithSharedSequenceNameB());
+ assertEquals(new Long(2l), b.getPK());
+
+ store.getTxn().abort();
+ }
+
+ @Test
public void testSimple() throws Exception {
EntityStore store = new EntityStore(getDirectory("entityStore/testSimple"));
+ store.getConfiguration().setValuesPartitionByteSize(10 * Configuration.megaByte);
+ store.getConfiguration().setKeysPartitionByteSize(1 * Configuration.megaByte);
+ store.getConfiguration().setHashCodesPartitionByteSize(1 * Configuration.megaByte);
+
PrimaryIndex<Long, User> users = store.getPrimaryIndex(Long.class, User.class);
PrimaryIndex<Long, Message> messages = store.getPrimaryIndex(Long.class, Message.class);
@@ -73,7 +100,7 @@
assertEquals("new secret", users.get(0l).getPassword());
assertEquals(new Long(1l), messages.get(0l).getToUserFK());
-
+
store.getTxn().commit();
store.getTxn().begin();
@@ -85,6 +112,58 @@
}
@Entity
+ public static class MissingSequenceName implements Serializable {
+
+ private static final long serialVersionUID = 1l;
+
+ @PrimaryKey
+ private Long PK;
+
+ public Long getPK() {
+ return PK;
+ }
+
+ public void setPK(Long PK) {
+ this.PK = PK;
+ }
+ }
+
+ @Entity
+ public static class WithSharedSequenceNameB implements Serializable {
+
+ private static final long serialVersionUID = 1l;
+
+ @PrimaryKey(sequence = "my sequence")
+ private Long PK;
+
+ public Long getPK() {
+ return PK;
+ }
+
+ public void setPK(Long PK) {
+ this.PK = PK;
+ }
+ }
+
+ @Entity
+ public static class WithSharedSequenceNameA implements Serializable {
+
+ private static final long serialVersionUID = 1l;
+
+ @PrimaryKey(sequence = "my sequence")
+ private Long PK;
+
+ public Long getPK() {
+ return PK;
+ }
+
+ public void setPK(Long PK) {
+ this.PK = PK;
+ }
+ }
+
+
+ @Entity
public static class User implements Serializable {
private static final long serialVersionUID = 1l;
Modified: labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/store/StoreTest.java
URL: http://svn.apache.org/viewvc/labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/store/StoreTest.java?rev=757279&r1=757278&r2=757279&view=diff
==============================================================================
--- labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/store/StoreTest.java (original)
+++ labs/bananadb/trunk/src/test/java/org/apache/labs/bananadb/store/StoreTest.java Sun Mar 22 23:41:38 2009
@@ -34,10 +34,12 @@
private File path;
protected StoreTest() {
+ System.setProperty("bananadb.never.turn.this.on", "on");
path = new File("target/test-data/stores");
if (!path.exists() && !path.mkdirs()) {
throw new RuntimeException("Could not create path " + path);
}
+
}
protected File getDirectory(String name) {
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@labs.apache.org
For additional commands, e-mail: commits-help@labs.apache.org