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:08:25 UTC
svn commit: r1576726 - in /gora/trunk/gora-cassandra/src:
main/java/org/apache/gora/cassandra/store/ test/conf/
Author: rmarroquin
Date: Wed Mar 12 13:08:25 2014
New Revision: 1576726
URL: http://svn.apache.org/r1576726
Log:
GORA-154
Modified:
gora/trunk/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/CassandraClient.java
gora/trunk/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/CassandraMapping.java
gora/trunk/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/CassandraStore.java
gora/trunk/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/HectorUtils.java
gora/trunk/gora-cassandra/src/test/conf/gora-cassandra-mapping.xml
Modified: gora/trunk/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/CassandraClient.java
URL: http://svn.apache.org/viewvc/gora/trunk/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/CassandraClient.java?rev=1576726&r1=1576725&r2=1576726&view=diff
==============================================================================
--- gora/trunk/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/CassandraClient.java (original)
+++ gora/trunk/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/CassandraClient.java Wed Mar 12 13:08:25 2014
@@ -244,6 +244,10 @@ 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());
@@ -251,7 +255,7 @@ public class CassandraClient<K, T extend
}
synchronized(mutator) {
- HectorUtils.insertColumn(mutator, key, columnFamily, columnName, byteBuffer);
+ HectorUtils.insertColumn(mutator, key, columnFamily, columnName, byteBuffer, ttlAttr);
}
}
@@ -271,9 +275,13 @@ 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);
}
}
@@ -316,10 +324,36 @@ public class CassandraClient<K, T extend
}
}
+ /**
+ * Deletes a subColumn which is a field inside a column.
+ * @param key Identifying the row.
+ * @param fieldName The field's name.
+ * @param columnName The column's name.
+ */
public void deleteSubColumn(K key, String fieldName, String columnName) {
deleteSubColumn(key, fieldName, StringSerializer.get().toByteBuffer(columnName));
}
+ /**
+ * 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);
+ }
+ }
+
+ /**
+ * Delete all content related to a key.
+ * @param key
+ */
+ public void deleteByKey(K key) {
+ Map<String, String> familyMap = this.cassandraMapping.getFamilyMap();
+ deleteColumn(key, familyMap.values().iterator().next().toString(), null);
+ }
public void addGenericArray(K key, String fieldName, GenericArray<?> array) {
if (isSuper( cassandraMapping.getFamily(fieldName) )) {
@@ -336,7 +370,6 @@ public class CassandraClient<K, T extend
continue;
}
}
-
addSubColumn(key, fieldName, i++, itemValue);
}
}
@@ -365,7 +398,6 @@ public class CassandraClient<K, T extend
continue;
}
}
-
addSubColumn(key, fieldName, mapKey.toString(), mapValue);
}
}
@@ -428,7 +460,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();
}
@@ -495,7 +526,6 @@ public class CassandraClient<K, T extend
map.put(family + ":" + column, field);
}
-
return map;
}
@@ -522,7 +552,6 @@ public class CassandraClient<K, T extend
rangeSuperSlicesQuery.setRowCount(limit);
rangeSuperSlicesQuery.setColumnNames(columnNames);
-
QueryResult<OrderedSuperRows<K, String, ByteBuffer, ByteBuffer>> queryResult = rangeSuperSlicesQuery.execute();
OrderedSuperRows<K, String, ByteBuffer, ByteBuffer> orderedRows = queryResult.get();
return orderedRows.getList();
Modified: gora/trunk/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/CassandraMapping.java
URL: http://svn.apache.org/viewvc/gora/trunk/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/CassandraMapping.java?rev=1576726&r1=1576725&r2=1576726&view=diff
==============================================================================
--- gora/trunk/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/CassandraMapping.java (original)
+++ gora/trunk/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/CassandraMapping.java Wed Mar 12 13:08:25 2014
@@ -44,12 +44,15 @@ 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;
private String keyspaceName;
-
/**
* List of the super column families.
*/
@@ -66,6 +69,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 +125,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 +162,15 @@ 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()) {
@@ -171,7 +188,7 @@ public class CassandraMapping {
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 +199,8 @@ 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,6 +213,9 @@ 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) {
@@ -202,8 +224,9 @@ public class CassandraMapping {
this.familyMap.put(fieldName, familyName);
this.columnMap.put(fieldName, columnName);
-
- }
+ // TODO we should find a way of storing more values into this map i.e. more column attributes
+ this.columnAttrMap.put(columnName, ttlValue!=null?ttlValue:DEFAULT_COLUMNS_TTL);
+ }
}
/**
@@ -217,15 +240,41 @@ public class CassandraMapping {
this.columnMap.put(pFieldName, pColumnName);
}
+ /**
+ * Gets the columnFamily related to the column name.
+ * @param name
+ * @return
+ */
public String getFamily(String name) {
return this.familyMap.get(name);
}
+ /**
+ * Gets the column related to a field.
+ * @param name
+ * @return
+ */
public String getColumn(String name) {
return this.columnMap.get(name);
}
/**
+ * Gets all the columnFamilies defined.
+ * @return
+ */
+ public Map<String,String> getFamilyMap(){
+ return this.familyMap;
+ }
+
+ /**
+ * Gets all attributes related to a column.
+ * @return
+ */
+ public Map<String, String> getColumnsAttribs(){
+ return this.columnAttrMap;
+ }
+
+ /**
* Read family super attribute.
* @param family the family name
* @return true is the family is a super column family
Modified: gora/trunk/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/CassandraStore.java
URL: http://svn.apache.org/viewvc/gora/trunk/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/CassandraStore.java?rev=1576726&r1=1576725&r2=1576726&view=diff
==============================================================================
--- gora/trunk/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/CassandraStore.java (original)
+++ gora/trunk/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/CassandraStore.java Wed Mar 12 13:08:25 2014
@@ -144,7 +144,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
Modified: gora/trunk/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/HectorUtils.java
URL: http://svn.apache.org/viewvc/gora/trunk/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/HectorUtils.java?rev=1576726&r1=1576725&r2=1576726&view=diff
==============================================================================
--- gora/trunk/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/HectorUtils.java (original)
+++ gora/trunk/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/HectorUtils.java Wed Mar 12 13:08:25 2014
@@ -27,6 +27,7 @@ import me.prettyprint.cassandra.serializ
import me.prettyprint.hector.api.beans.HColumn;
import me.prettyprint.hector.api.beans.HSuperColumn;
import me.prettyprint.hector.api.factory.HFactory;
+import me.prettyprint.hector.api.mutation.MutationResult;
import me.prettyprint.hector.api.mutation.Mutator;
import org.apache.gora.persistency.Persistent;
@@ -38,59 +39,65 @@ 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));
+ /** Methods to insert columns. */
+ 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());
+ /** Methods to create columns. */
+ 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));
+ /** Methods to create subColumns. */
+ 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));
}
-
+ /** Methods to delete subColumns. */
public static<K> void deleteSubColumn(Mutator<K> mutator, K key, String columnFamily, String superColumnName, ByteBuffer columnName) {
mutator.subDelete(key, columnFamily, superColumnName, columnName, StringSerializer.get(), ByteBufferSerializer.get());
}
+ /** Methods do delete columns. */
+ public static<K> void deleteColumn(Mutator<K> mutator, K key, String columnFamily, ByteBuffer columnName){
+ MutationResult mr = mutator.delete(key, columnFamily, columnName, ByteBufferSerializer.get());
+ System.out.println(mr.toString());
+ }
+ /** Methods to create superColumns. */
@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/trunk/gora-cassandra/src/test/conf/gora-cassandra-mapping.xml
URL: http://svn.apache.org/viewvc/gora/trunk/gora-cassandra/src/test/conf/gora-cassandra-mapping.xml?rev=1576726&r1=1576725&r2=1576726&view=diff
==============================================================================
--- gora/trunk/gora-cassandra/src/test/conf/gora-cassandra-mapping.xml (original)
+++ gora/trunk/gora-cassandra/src/test/conf/gora-cassandra-mapping.xml Wed Mar 12 13:08:25 2014
@@ -19,39 +19,39 @@
<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="metadata" family="sc" 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="metadata" family="sc" 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>