You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@gora.apache.org by rm...@apache.org on 2014/03/12 14:13:47 UTC

svn commit: r1576727 - in /gora/branches/GORA_94: gora-cassandra/src/main/java/org/apache/gora/cassandra/store/ gora-cassandra/src/test/conf/ gora-core/src/test/java/org/apache/gora/store/

Author: rmarroquin
Date: Wed Mar 12 13:13:46 2014
New Revision: 1576727

URL: http://svn.apache.org/r1576727
Log:
GORA-245. Fixing failing test and adding GORA-154 to branch GORA_94.

Modified:
    gora/branches/GORA_94/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/CassandraClient.java
    gora/branches/GORA_94/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/CassandraMapping.java
    gora/branches/GORA_94/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/CassandraStore.java
    gora/branches/GORA_94/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/HectorUtils.java
    gora/branches/GORA_94/gora-cassandra/src/test/conf/gora-cassandra-mapping.xml
    gora/branches/GORA_94/gora-core/src/test/java/org/apache/gora/store/DataStoreTestUtil.java

Modified: gora/branches/GORA_94/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/CassandraClient.java
URL: http://svn.apache.org/viewvc/gora/branches/GORA_94/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/CassandraClient.java?rev=1576727&r1=1576726&r2=1576727&view=diff
==============================================================================
--- gora/branches/GORA_94/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/CassandraClient.java (original)
+++ gora/branches/GORA_94/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/CassandraClient.java Wed Mar 12 13:13:46 2014
@@ -106,7 +106,7 @@ public class CassandraClient<K, T extend
     // "describe keyspace <keyspaceName>;" query
     KeyspaceDefinition keyspaceDefinition = this.cluster.describeKeyspace(this.cassandraMapping.getKeyspaceName());
     if (keyspaceDefinition == null) {
-      List<ColumnFamilyDefinition> columnFamilyDefinitions = this.cassandraMapping.getColumnFamilyDefinitions();      
+      List<ColumnFamilyDefinition> columnFamilyDefinitions = this.cassandraMapping.getColumnFamilyDefinitions();
 
       // GORA-197
       for (ColumnFamilyDefinition cfDef : columnFamilyDefinitions) {
@@ -155,12 +155,11 @@ public class CassandraClient<K, T extend
       }
     }
   }
-  
+
   /**
    * Drop keyspace.
    */
   public void dropKeyspace() {
-    // "drop keyspace <keyspaceName>;" query
     this.cluster.dropKeyspace(this.cassandraMapping.getKeyspaceName());
   }
 
@@ -178,18 +177,41 @@ public class CassandraClient<K, T extend
     ByteBuffer byteBuffer = toByteBuffer(value);
     String columnFamily = this.cassandraMapping.getFamily(fieldName);
     String columnName = this.cassandraMapping.getColumn(fieldName);
+    String ttlAttr = this.cassandraMapping.getColumnsAttribs().get(fieldName);
+    if (ttlAttr == null)
+      ttlAttr = CassandraMapping.DEFAULT_COLUMNS_TTL;
 
     if (columnName == null) {
       LOG.warn("Column name is null for field=" + fieldName + " with value=" + value.toString());
       return;
     }
-    
     synchronized(mutator) {
-      HectorUtils.insertColumn(mutator, key, columnFamily, columnName, byteBuffer);
+      HectorUtils.insertColumn(mutator, key, columnFamily, columnName, byteBuffer, ttlAttr);
+    }
+  }
+
+  /**
+   * Delete a row within the keyspace.
+   * @param key
+   * @param fieldName
+   * @param columnName
+   */
+  public void deleteColumn(K key, String familyName, ByteBuffer columnName) {
+    synchronized(mutator) {
+      HectorUtils.deleteColumn(mutator, key, familyName, columnName);
     }
   }
 
   /**
+   * Deletes an entry based on its key.
+   * @param key
+   */
+  public void deleteByKey(K key) {
+    Map<String, String> familyMap = this.cassandraMapping.getFamilyMap();
+    deleteColumn(key, familyMap.values().iterator().next().toString(), null);
+  }
+
+  /**
    * Insert a member in a super column. This is used for map and record Avro types.
    * @param key the row key
    * @param fieldName the field name
@@ -205,9 +227,11 @@ public class CassandraClient<K, T extend
     
     String columnFamily = this.cassandraMapping.getFamily(fieldName);
     String superColumnName = this.cassandraMapping.getColumn(fieldName);
-    
+    String ttlAttr = this.cassandraMapping.getColumnsAttribs().get(fieldName);
+    if (ttlAttr == null)
+      ttlAttr = CassandraMapping.DEFAULT_COLUMNS_TTL;
     synchronized(mutator) {
-      HectorUtils.insertSubColumn(mutator, key, columnFamily, superColumnName, columnName, byteBuffer);
+      HectorUtils.insertSubColumn(mutator, key, columnFamily, superColumnName, columnName, byteBuffer, ttlAttr);
     }
   }
 
@@ -250,10 +274,28 @@ public class CassandraClient<K, T extend
     }
   }
 
+  /**
+   * Deletes a subColumn 
+   * @param key
+   * @param fieldName
+   * @param columnName
+   */
   public void deleteSubColumn(K key, String fieldName, String columnName) {
     deleteSubColumn(key, fieldName, StringSerializer.get().toByteBuffer(columnName));
   }
 
+  /**
+   * Deletes all subcolumns from a super column.
+   * @param key the row key.
+   * @param fieldName the field name.
+   */
+  public void deleteSubColumn(K key, String fieldName) {
+    String columnFamily = this.cassandraMapping.getFamily(fieldName);
+    String superColumnName = this.cassandraMapping.getColumn(fieldName);
+    synchronized(mutator) {
+      HectorUtils.deleteSubColumn(mutator, key, columnFamily, superColumnName, null);
+    }
+  }
 
   public void addGenericArray(K key, String fieldName, GenericArray<?> array) {
     if (isSuper( cassandraMapping.getFamily(fieldName) )) {
@@ -281,21 +323,25 @@ public class CassandraClient<K, T extend
 
   public void addStatefulHashMap(K key, String fieldName, Map<CharSequence,Object> map) {
     if (isSuper( cassandraMapping.getFamily(fieldName) )) {
-      for (CharSequence mapKey: map.keySet()) {
-
-        // TODO: hack, do not store empty arrays
-        Object mapValue = map.get(mapKey);
-        if (mapValue instanceof GenericArray<?>) {
-          if (((List<?>)mapValue).size() == 0) {
-            continue;
-          }
-        } else if (mapValue instanceof Map<?,?>) {
-          if (((Map<?, ?>)mapValue).size() == 0) {
-            continue;
+      // as we don't know what has changed inside the map or If it's an empty map, then delete its content.
+      deleteSubColumn(key, fieldName);
+      // update if there is anything to update.
+      if (!map.isEmpty()) {
+        // If it's not empty, then update its content.
+        for (CharSequence mapKey: map.keySet()) {
+          // TODO: hack, do not store empty arrays
+          Object mapValue = map.get(mapKey);
+          if (mapValue instanceof GenericArray<?>) {
+            if (((List<?>)mapValue).size() == 0) {
+              continue;
+            }
+          } else if (mapValue instanceof Map<?,?>) {
+            if (((Map<?, ?>)mapValue).size() == 0) {
+              continue;
+            }
           }
+          addSubColumn(key, fieldName, mapKey.toString(), mapValue);
         }
-
-        addSubColumn(key, fieldName, mapKey.toString(), mapValue);
       }
     }
     else {
@@ -356,7 +402,6 @@ public class CassandraClient<K, T extend
     QueryResult<OrderedRows<K, ByteBuffer, ByteBuffer>> queryResult = rangeSlicesQuery.execute();
     OrderedRows<K, ByteBuffer, ByteBuffer> orderedRows = queryResult.get();
     
-    
     return orderedRows.getList();
   }
   
@@ -397,11 +442,9 @@ public class CassandraClient<K, T extend
         list = new ArrayList<String>();
         map.put(family, list);
       }
-      
       if (column != null) {
         list.add(column);
       }
-      
     }
     
     return map;
@@ -434,7 +477,12 @@ public class CassandraClient<K, T extend
     
     return map;
   }
-  
+
+  /**
+   * Determines if a column is a superColumn or not.
+   * @param family
+   * @return boolean
+   */
   public boolean isSuper(String family) {
     return this.cassandraMapping.isSuper(family);
   }

Modified: gora/branches/GORA_94/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/CassandraMapping.java
URL: http://svn.apache.org/viewvc/gora/branches/GORA_94/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/CassandraMapping.java?rev=1576727&r1=1576726&r2=1576727&view=diff
==============================================================================
--- gora/branches/GORA_94/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/CassandraMapping.java (original)
+++ gora/branches/GORA_94/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/CassandraMapping.java Wed Mar 12 13:13:46 2014
@@ -44,6 +44,10 @@ public class CassandraMapping {
   private static final String CLUSTER_ATTRIBUTE = "cluster";
   private static final String HOST_ATTRIBUTE = "host";
 
+  private static final String GCGRACE_SECONDS_ATTRIBUTE = "gc_grace_seconds";
+  private static final String COLUMNS_TTL_ATTRIBUTE = "ttl";
+  public static final String DEFAULT_COLUMNS_TTL = "60";
+  public static final int DEFAULT_GCGRACE_SECONDS = 30;
 
   private String hostName;
   private String clusterName;
@@ -66,6 +70,11 @@ public class CassandraMapping {
   private Map<String, String> columnMap = new HashMap<String, String>();
 
   /**
+   * Helps storing attributes defined for each field.
+   */
+  private Map<String, String> columnAttrMap = new HashMap<String, String>();
+  
+  /**
    * Look up the column family from its name.
    */
   private Map<String, BasicColumnFamilyDefinition> columnFamilyDefinitions = 
@@ -117,7 +126,7 @@ public class CassandraMapping {
     }
     this.keyspaceName = keyspace.getAttributeValue(NAME_ATTRIBUTE);
     if (this.keyspaceName == null) {
-    	LOG.error("Error locating Cassandra Keyspace name attribute!");
+      LOG.error("Error locating Cassandra Keyspace name attribute!");
     } else {
       if (LOG.isDebugEnabled()) {
         LOG.debug("Located Cassandra Keyspace name: '" + keyspaceName + "'");
@@ -154,6 +163,16 @@ public class CassandraMapping {
           LOG.debug("Located column family: '" + familyName + "'" );
         }
       }
+      String gcgrace_scs = element.getAttributeValue(GCGRACE_SECONDS_ATTRIBUTE);
+      if (gcgrace_scs == null) {
+        LOG.warn("Error locating gc_grace_seconds attribute for '" + familyName + "' column family");
+        LOG.warn("Using default set to: " + DEFAULT_GCGRACE_SECONDS);
+      } else {
+        if (LOG.isDebugEnabled()) {
+        LOG.debug("Located gc_grace_seconds: '" + gcgrace_scs + "'" );
+        }
+      }
+
       String superAttribute = element.getAttributeValue(SUPER_ATTRIBUTE);
       if (superAttribute != null) {
         if (LOG.isDebugEnabled()) {
@@ -166,12 +185,13 @@ public class CassandraMapping {
         cfDef.setColumnType(ColumnType.SUPER);
         cfDef.setSubComparatorType(ComparatorType.BYTESTYPE);
       }
-      
+
       cfDef.setKeyspaceName(this.keyspaceName);
       cfDef.setName(familyName);
       cfDef.setComparatorType(ComparatorType.BYTESTYPE);
       cfDef.setDefaultValidationClass(ComparatorType.BYTESTYPE.getClassName());
-      
+
+      cfDef.setGcGraceSeconds(gcgrace_scs!=null?Integer.parseInt(gcgrace_scs):DEFAULT_GCGRACE_SECONDS);
       this.columnFamilyDefinitions.put(familyName, cfDef);
 
     }
@@ -182,6 +202,7 @@ public class CassandraMapping {
       String fieldName = element.getAttributeValue(NAME_ATTRIBUTE);
       String familyName = element.getAttributeValue(FAMILY_ATTRIBUTE);
       String columnName = element.getAttributeValue(COLUMN_ATTRIBUTE);
+      String ttlValue = element.getAttributeValue(COLUMNS_TTL_ATTRIBUTE);
       if (fieldName == null) {
        LOG.error("Field name is not declared.");
         continue;
@@ -194,16 +215,20 @@ public class CassandraMapping {
         LOG.warn("Column name (qualifier) is not declared for \"" + fieldName + "\" field.");
         columnName = fieldName;
       }
+      if (ttlValue == null) {
+        LOG.warn("TTL value is not defined for \"" + fieldName + "\" field. \n Using default value: " + DEFAULT_COLUMNS_TTL);
+      }
 
       BasicColumnFamilyDefinition columnFamilyDefinition = this.columnFamilyDefinitions.get(familyName);
       if (columnFamilyDefinition == null) {
         LOG.warn("Family " + familyName + " was not declared in the keyspace.");
       }
-      
+
       this.familyMap.put(fieldName, familyName);
       this.columnMap.put(fieldName, columnName);
-      
-    }    
+      // TODO we should find a way of storing more values into this map
+      this.columnAttrMap.put(columnName, ttlValue!=null?ttlValue:DEFAULT_COLUMNS_TTL);
+    }
   }
 
   /**
@@ -225,6 +250,14 @@ public class CassandraMapping {
     return this.columnMap.get(name);
   }
 
+  public Map<String,String> getFamilyMap(){
+    return this.familyMap;
+  }
+
+  public Map<String, String> getColumnsAttribs(){
+    return this.columnAttrMap;
+  }
+
   /**
    * Read family super attribute.
    * @param family the family name

Modified: gora/branches/GORA_94/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/CassandraStore.java
URL: http://svn.apache.org/viewvc/gora/branches/GORA_94/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/CassandraStore.java?rev=1576727&r1=1576726&r2=1576727&view=diff
==============================================================================
--- gora/branches/GORA_94/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/CassandraStore.java (original)
+++ gora/branches/GORA_94/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/CassandraStore.java Wed Mar 12 13:13:46 2014
@@ -148,8 +148,8 @@ public class CassandraStore<K, T extends
 
   @Override
   public boolean delete(K key) {
-    LOG.debug("delete " + key);
-    return false;
+    this.cassandraClient.deleteByKey(key);
+    return true;
   }
 
   @Override
@@ -580,7 +580,8 @@ public class CassandraStore<K, T extends
           addOrUpdateField(key, field, unionSchema, value);
           //this.cassandraClient.addColumn(key, field.name(), value);
         } else {
-          LOG.warn("Union with 'null' value not supported for field: " + field.name());
+          LOG.warn("Setting content of: " + field.name() + " to null.");
+          delete(key);
         }
         break;
       default:

Modified: gora/branches/GORA_94/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/HectorUtils.java
URL: http://svn.apache.org/viewvc/gora/branches/GORA_94/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/HectorUtils.java?rev=1576727&r1=1576726&r2=1576727&view=diff
==============================================================================
--- gora/branches/GORA_94/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/HectorUtils.java (original)
+++ gora/branches/GORA_94/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/HectorUtils.java Wed Mar 12 13:13:46 2014
@@ -38,38 +38,38 @@ import org.apache.gora.persistency.Persi
  */
 public class HectorUtils<K,T extends Persistent> {
 
-  public static<K> void insertColumn(Mutator<K> mutator, K key, String columnFamily, ByteBuffer columnName, ByteBuffer columnValue) {
-    mutator.insert(key, columnFamily, createColumn(columnName, columnValue));
+  public static<K> void insertColumn(Mutator<K> mutator, K key, String columnFamily, ByteBuffer columnName, ByteBuffer columnValue, String ttlAttr) {
+    mutator.insert(key, columnFamily, createColumn(columnName, columnValue, ttlAttr));
   }
 
-  public static<K> void insertColumn(Mutator<K> mutator, K key, String columnFamily, String columnName, ByteBuffer columnValue) {
-    mutator.insert(key, columnFamily, createColumn(columnName, columnValue));
+  public static<K> void insertColumn(Mutator<K> mutator, K key, String columnFamily, String columnName, ByteBuffer columnValue, String ttlAttr) {
+    mutator.insert(key, columnFamily, createColumn(columnName, columnValue, ttlAttr));
   }
 
 
-  public static<K> HColumn<ByteBuffer,ByteBuffer> createColumn(ByteBuffer name, ByteBuffer value) {
-    return HFactory.createColumn(name, value, ByteBufferSerializer.get(), ByteBufferSerializer.get());
+  public static<K> HColumn<ByteBuffer,ByteBuffer> createColumn(ByteBuffer name, ByteBuffer value, String ttlAttr) {
+    return HFactory.createColumn(name, value, ByteBufferSerializer.get(), ByteBufferSerializer.get()).setTtl(Integer.parseInt(ttlAttr));
   }
 
-  public static<K> HColumn<String,ByteBuffer> createColumn(String name, ByteBuffer value) {
-    return HFactory.createColumn(name, value, StringSerializer.get(), ByteBufferSerializer.get());
+  public static<K> HColumn<String,ByteBuffer> createColumn(String name, ByteBuffer value, String ttlAttr) {
+    return HFactory.createColumn(name, value, StringSerializer.get(), ByteBufferSerializer.get()).setTtl(Integer.parseInt(ttlAttr));
   }
 
-  public static<K> HColumn<Integer,ByteBuffer> createColumn(Integer name, ByteBuffer value) {
-    return HFactory.createColumn(name, value, IntegerSerializer.get(), ByteBufferSerializer.get());
+  public static<K> HColumn<Integer,ByteBuffer> createColumn(Integer name, ByteBuffer value, String ttlAttr) {
+    return HFactory.createColumn(name, value, IntegerSerializer.get(), ByteBufferSerializer.get()).setTtl(Integer.parseInt(ttlAttr));
   }
 
 
-  public static<K> void insertSubColumn(Mutator<K> mutator, K key, String columnFamily, String superColumnName, ByteBuffer columnName, ByteBuffer columnValue) {
-    mutator.insert(key, columnFamily, createSuperColumn(superColumnName, columnName, columnValue));
+  public static<K> void insertSubColumn(Mutator<K> mutator, K key, String columnFamily, String superColumnName, ByteBuffer columnName, ByteBuffer columnValue, String ttlAttr) {
+    mutator.insert(key, columnFamily, createSuperColumn(superColumnName, columnName, columnValue, ttlAttr));
   }
 
-  public static<K> void insertSubColumn(Mutator<K> mutator, K key, String columnFamily, String superColumnName, String columnName, ByteBuffer columnValue) {
-    mutator.insert(key, columnFamily, createSuperColumn(superColumnName, columnName, columnValue));
+  public static<K> void insertSubColumn(Mutator<K> mutator, K key, String columnFamily, String superColumnName, String columnName, ByteBuffer columnValue, String ttlAttr) {
+    mutator.insert(key, columnFamily, createSuperColumn(superColumnName, columnName, columnValue, ttlAttr));
   }
 
-  public static<K> void insertSubColumn(Mutator<K> mutator, K key, String columnFamily, String superColumnName, Integer columnName, ByteBuffer columnValue) {
-    mutator.insert(key, columnFamily, createSuperColumn(superColumnName, columnName, columnValue));
+  public static<K> void insertSubColumn(Mutator<K> mutator, K key, String columnFamily, String superColumnName, Integer columnName, ByteBuffer columnValue, String ttlAttr) {
+    mutator.insert(key, columnFamily, createSuperColumn(superColumnName, columnName, columnValue, ttlAttr));
   }
 
 
@@ -77,20 +77,20 @@ public class HectorUtils<K,T extends Per
     mutator.subDelete(key, columnFamily, superColumnName, columnName, StringSerializer.get(), ByteBufferSerializer.get());
   }
 
+  public static<K> void deleteColumn(Mutator<K> mutator, K key, String columnFamily, ByteBuffer columnName){
+    mutator.delete(key, columnFamily, columnName, ByteBufferSerializer.get());
+  }
 
-  @SuppressWarnings("unchecked")
-  public static<K> HSuperColumn<String,ByteBuffer,ByteBuffer> createSuperColumn(String superColumnName, ByteBuffer columnName, ByteBuffer columnValue) {
-    return HFactory.createSuperColumn(superColumnName, Arrays.asList(createColumn(columnName, columnValue)), StringSerializer.get(), ByteBufferSerializer.get(), ByteBufferSerializer.get());
+  public static<K> HSuperColumn<String,ByteBuffer,ByteBuffer> createSuperColumn(String superColumnName, ByteBuffer columnName, ByteBuffer columnValue, String ttlAttr) {
+    return HFactory.createSuperColumn(superColumnName, Arrays.asList(createColumn(columnName, columnValue, ttlAttr)), StringSerializer.get(), ByteBufferSerializer.get(), ByteBufferSerializer.get());
   }
 
-  @SuppressWarnings("unchecked")
-  public static<K> HSuperColumn<String,String,ByteBuffer> createSuperColumn(String superColumnName, String columnName, ByteBuffer columnValue) {
-    return HFactory.createSuperColumn(superColumnName, Arrays.asList(createColumn(columnName, columnValue)), StringSerializer.get(), StringSerializer.get(), ByteBufferSerializer.get());
+  public static<K> HSuperColumn<String,String,ByteBuffer> createSuperColumn(String superColumnName, String columnName, ByteBuffer columnValue, String ttlAttr) {
+    return HFactory.createSuperColumn(superColumnName, Arrays.asList(createColumn(columnName, columnValue, ttlAttr)), StringSerializer.get(), StringSerializer.get(), ByteBufferSerializer.get());
   }
 
-  @SuppressWarnings("unchecked")
-  public static<K> HSuperColumn<String,Integer,ByteBuffer> createSuperColumn(String superColumnName, Integer columnName, ByteBuffer columnValue) {
-    return HFactory.createSuperColumn(superColumnName, Arrays.asList(createColumn(columnName, columnValue)), StringSerializer.get(), IntegerSerializer.get(), ByteBufferSerializer.get());
+  public static<K> HSuperColumn<String,Integer,ByteBuffer> createSuperColumn(String superColumnName, Integer columnName, ByteBuffer columnValue, String ttlAttr) {
+    return HFactory.createSuperColumn(superColumnName, Arrays.asList(createColumn(columnName, columnValue, ttlAttr)), StringSerializer.get(), IntegerSerializer.get(), ByteBufferSerializer.get());
   }
 
 }

Modified: gora/branches/GORA_94/gora-cassandra/src/test/conf/gora-cassandra-mapping.xml
URL: http://svn.apache.org/viewvc/gora/branches/GORA_94/gora-cassandra/src/test/conf/gora-cassandra-mapping.xml?rev=1576727&r1=1576726&r2=1576727&view=diff
==============================================================================
--- gora/branches/GORA_94/gora-cassandra/src/test/conf/gora-cassandra-mapping.xml (original)
+++ gora/branches/GORA_94/gora-cassandra/src/test/conf/gora-cassandra-mapping.xml Wed Mar 12 13:13:46 2014
@@ -19,40 +19,40 @@
 
 <gora-orm>
   <keyspace name="Employee" host="localhost" cluster="Gora Cassandra Test Cluster">
-    <family name="p"/>
+    <family name="p" gc_grace_seconds="5"/>
      <family name="sc" type="super" />
   </keyspace>
 
   <keyspace name="WebPage" host="localhost" cluster="Gora Cassandra Test Cluster">
-    <family name="p"/>
+    <family name="p" gc_grace_seconds="5"/>
     <family name="sc" type="super"/>
   </keyspace>
 
   <keyspace name="TokenDatum" host="localhost" cluster="Gora Cassandra Test Cluster">
-    <family name="p"/>
+    <family name="p" gc_grace_seconds="5"/>
     <family name="sc" type="super"/>
   </keyspace>
 
   <class name="org.apache.gora.examples.generated.Employee" keyClass="java.lang.String" keyspace="Employee">
-    <field name="name"  family="p" qualifier="info:nm"/>
-    <field name="dateOfBirth"  family="p" qualifier="info:db"/>
-    <field name="ssn"  family="p" qualifier="info:sn"/>
-    <field name="salary"  family="p" qualifier="info:sl"/>
-    <field name="boss" family="p" qualifier="info:bs"/>
-    <field name="webpage" family="p" qualifier="info:wp"/>
+    <field name="name"  family="p" qualifier="info:nm" ttl="10"/>
+    <field name="dateOfBirth"  family="p" qualifier="info:db" ttl="10"/>
+    <field name="ssn"  family="p" qualifier="info:sn" ttl="10"/>
+    <field name="salary"  family="p" qualifier="info:sl" ttl="10"/>
+    <field name="boss" family="p" qualifier="info:bs" ttl="10"/>
+    <field name="webpage" family="p" qualifier="info:wp" ttl="10"/>
   </class>
 
   <class name="org.apache.gora.examples.generated.WebPage" keyClass="java.lang.String" keyspace="WebPage">
-    <field name="url" family="p" qualifier="c:u"/>
-    <field name="content" family="p" qualifier="p:cnt:c"/>
-    <field name="parsedContent" family="sc" qualifier="p:parsedContent"/>
-    <field name="outlinks" family="sc" qualifier="p:outlinks"/>
-    <field name="headers" family="sc" qualifier="p:headers"/>
-    <field name="metadata" family="p" qualifier="c:mt"/>
+    <field name="url" family="p" qualifier="c:u" ttl="10"/>
+    <field name="content" family="p" qualifier="p:cnt:c" ttl="10"/>
+    <field name="parsedContent" family="sc" qualifier="p:parsedContent" ttl="10"/>
+    <field name="outlinks" family="sc" qualifier="p:outlinks" ttl="10"/>
+    <field name="headers" family="sc" qualifier="p:headers" ttl="10"/>
+    <field name="metadata" family="p" qualifier="c:mt" ttl="10"/>
   </class>
 
   <class name="org.apache.gora.examples.generated.TokenDatum" keyClass="java.lang.String" keyspace="TokenDatum">
-    <field name="count"  family="p" qualifier="common:count"/>
+    <field name="count"  family="p" qualifier="common:count" ttl="10"/>
   </class>
 
 </gora-orm>

Modified: gora/branches/GORA_94/gora-core/src/test/java/org/apache/gora/store/DataStoreTestUtil.java
URL: http://svn.apache.org/viewvc/gora/branches/GORA_94/gora-core/src/test/java/org/apache/gora/store/DataStoreTestUtil.java?rev=1576727&r1=1576726&r2=1576727&view=diff
==============================================================================
--- gora/branches/GORA_94/gora-core/src/test/java/org/apache/gora/store/DataStoreTestUtil.java (original)
+++ gora/branches/GORA_94/gora-core/src/test/java/org/apache/gora/store/DataStoreTestUtil.java Wed Mar 12 13:13:46 2014
@@ -57,6 +57,8 @@ import org.apache.gora.util.AvroUtils;
 import org.apache.gora.util.ByteUtils;
 import org.apache.gora.util.StringUtils;
 
+import com.sun.istack.logging.Logger;
+
 /**
  * Test utilities for DataStores. This utility class provides everything
  * necessary for convenience tests in {@link DataStoreTestBase} to execute cleanly.
@@ -542,7 +544,6 @@ public class DataStoreTestUtil {
       }
       dataStore.put(webPage.getUrl().toString(), webPage);
     }
-
     dataStore.flush();
 
     for (int i = 0; i < urls.length; i++) {
@@ -557,14 +558,12 @@ public class DataStoreTestUtil {
       }
       dataStore.put(webPage.getUrl().toString(), webPage);
     }
-
     dataStore.flush();
 
     for (int i = 0; i < urls.length; i++) {
       WebPage webPage = dataStore.get(urls[i]);
-      int j = 0;
       int count = 0;
-      for (j = 0; j < urls.length; j++) {  //TODO j++ or j+=2 ?
+      for (int j = 1; j < urls.length; j += 2) {
         CharSequence link = webPage.getOutlinks().get(new Utf8(anchor + j));
         assertNotNull(link);
         assertEquals(urls[j], link.toString());
@@ -613,7 +612,7 @@ public class DataStoreTestUtil {
       WebPage webPage = dataStore.get(urls[i]);
       int j = 0;
       int count = 0;
-      for (j = 0; j < headers.length; j++) {  //TODO j++ or j+=2 ?
+      for (j = 0; j < headers.length; j+=2) {  //TODO j++ or j+=2 ?
         CharSequence headerSample = webPage.getHeaders().get(new Utf8(header + j));
         assertNotNull(headerSample);
         assertEquals(headers[j], headerSample.toString());
@@ -645,8 +644,10 @@ public class DataStoreTestUtil {
     // map entry removal test
     for (int i = 0; i < urls.length; i++) {
       WebPage webPage = dataStore.get(urls[i]);
+      webPage.getOutlinks().clear();
+      //webPage.setOutlinks(new org.apache.gora.persistency.impl.DirtyMapWrapper((java.util.Map)new HashMap<CharSequence, CharSequence>()));
       for (int j = 1; j < urls.length; j += 2) {
-        webPage.getOutlinks().put(new Utf8(anchor + j), null);
+        webPage.getOutlinks().put(new Utf8(anchor + j), new Utf8(urls[j]));
       }
       dataStore.put(webPage.getUrl().toString(), webPage);
     }
@@ -658,10 +659,11 @@ public class DataStoreTestUtil {
       WebPage webPage = dataStore.get(urls[i]);
       for (int j = 1; j < urls.length; j += 2) {
         CharSequence link = webPage.getOutlinks().get(new Utf8(anchor + j));
-        assertNull(link);
+        assertNotNull(link);
+        assertEquals(urls[j], link.toString());
         count++;
       }
-      assertEquals(urls.length - count, webPage.getOutlinks().size());
+      assertEquals(count, webPage.getOutlinks().size());
     }
   }