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