You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@gora.apache.org by le...@apache.org on 2012/08/23 23:28:17 UTC
svn commit: r1376707 [1/2] - in /gora/branches/goraamazon: bin/ conf/
gora-core/src/test/java/org/apache/gora/store/
gora-dynamodb/src/examples/java/org/apache/gora/examples/generated/
gora-dynamodb/src/main/java/org/apache/gora/dynamodb/compiler/ gora...
Author: lewismc
Date: Thu Aug 23 21:28:16 2012
New Revision: 1376707
URL: http://svn.apache.org/viewvc?rev=1376707&view=rev
Log:
GORA-103-v4 patch
Added:
gora/branches/goraamazon/gora-dynamodb/src/main/java/org/apache/gora/dynamodb/compiler/
gora/branches/goraamazon/gora-dynamodb/src/main/java/org/apache/gora/dynamodb/compiler/GoraDynamoDBCompiler.java
Modified:
gora/branches/goraamazon/bin/gora
gora/branches/goraamazon/conf/log4j.properties
gora/branches/goraamazon/gora-core/src/test/java/org/apache/gora/store/WSDataStoreTestBase.java
gora/branches/goraamazon/gora-dynamodb/src/examples/java/org/apache/gora/examples/generated/person.java
gora/branches/goraamazon/gora-dynamodb/src/main/java/org/apache/gora/dynamodb/query/DynamoDBKey.java
gora/branches/goraamazon/gora-dynamodb/src/main/java/org/apache/gora/dynamodb/query/DynamoDBQuery.java
gora/branches/goraamazon/gora-dynamodb/src/main/java/org/apache/gora/dynamodb/query/DynamoDBResult.java
gora/branches/goraamazon/gora-dynamodb/src/main/java/org/apache/gora/dynamodb/store/DynamoDBMapping.java
gora/branches/goraamazon/gora-dynamodb/src/main/java/org/apache/gora/dynamodb/store/DynamoDBStore.java
gora/branches/goraamazon/gora-dynamodb/src/test/conf/gora-dynamodb-mapping.xml
gora/branches/goraamazon/gora-dynamodb/src/test/conf/gora.properties
gora/branches/goraamazon/gora-dynamodb/src/test/java/org/apache/gora/dynamodb/GoraDynamoDBTestDriver.java
gora/branches/goraamazon/gora-dynamodb/src/test/java/org/apache/gora/dynamodb/TestDynamoDBStore.java
Modified: gora/branches/goraamazon/bin/gora
URL: http://svn.apache.org/viewvc/gora/branches/goraamazon/bin/gora?rev=1376707&r1=1376706&r2=1376707&view=diff
==============================================================================
--- gora/branches/goraamazon/bin/gora (original)
+++ gora/branches/goraamazon/bin/gora Thu Aug 23 21:28:16 2012
@@ -107,7 +107,7 @@ fi
#GORA_OPTS="$GORA_OPTS -Dhadoop.log.file=$GORA_LOGFILE"
# figure out which class to run
-if [ "$COMMAND" = "compile" ] ; then
+if [ "$COMMAND" = "goracompiler" ] ; then
MODULE=gora-core
CLASSPATH=$CLASSPATH:$GORA_HOME/$MODULE/target/classes/
CLASS=org.apache.gora.compiler.GoraCompiler
@@ -115,6 +115,10 @@ elif [ "$COMMAND" = "specificcompiler" ]
MODULE=gora-core
CLASSPATH=$CLASSPATH:$GORA_HOME/$MODULE/target/classes/
CLASS=org.apache.avro.specific.SpecificCompiler
+elif [ "$COMMAND" = "dynamocompiler" ] ; then
+ MODULE=gora-dynamodb
+ CLASSPATH=$CLASSPATH:$GORA_HOME/$MODULE/target/classes/
+ CLASS=org.apache.gora.dynamodb.compiler.GoraDynamoDBCompiler
elif [ "$COMMAND" = "logmanager" ] ; then
MODULE=gora-tutorial
CLASSPATH=$CLASSPATH:$GORA_HOME/$MODULE/target/classes/
Modified: gora/branches/goraamazon/conf/log4j.properties
URL: http://svn.apache.org/viewvc/gora/branches/goraamazon/conf/log4j.properties?rev=1376707&r1=1376706&r2=1376707&view=diff
==============================================================================
--- gora/branches/goraamazon/conf/log4j.properties (original)
+++ gora/branches/goraamazon/conf/log4j.properties Thu Aug 23 21:28:16 2012
@@ -13,7 +13,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-gora.root.logger=INFO,console
+gora.root.logger=DEBUG,console
gora.log.dir=.
gora.log.file=gora.log
Modified: gora/branches/goraamazon/gora-core/src/test/java/org/apache/gora/store/WSDataStoreTestBase.java
URL: http://svn.apache.org/viewvc/gora/branches/goraamazon/gora-core/src/test/java/org/apache/gora/store/WSDataStoreTestBase.java?rev=1376707&r1=1376706&r2=1376707&view=diff
==============================================================================
--- gora/branches/goraamazon/gora-core/src/test/java/org/apache/gora/store/WSDataStoreTestBase.java (original)
+++ gora/branches/goraamazon/gora-core/src/test/java/org/apache/gora/store/WSDataStoreTestBase.java Thu Aug 23 21:28:16 2012
@@ -15,6 +15,9 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+/**
+ * @author Renato Marroquin Mogrovejo
+ */
package org.apache.gora.store;
@@ -47,7 +50,6 @@ public abstract class WSDataStoreTestBas
protected static GoraTestDriver testDriver;
protected DataStore<K, T> dataStore;
- //protected DataStore<String, webpage> webPageStore;
private static boolean setUpClassCalled = false;
@@ -75,17 +77,16 @@ public abstract class WSDataStoreTestBas
public static void setUpClass() throws Exception {
if(testDriver != null && !setUpClassCalled) {
log.info("setting up class");
- //testDriver.setUpClass();
+ testDriver.setUpClass();
setUpClassCalled = true;
}
}
@AfterClass
public static void tearDownClass() throws Exception {
- if(testDriver != null) {
- log.info("tearing down class");
- testDriver.tearDownClass();
- }
+ log.info("tearing down class");
+ //if(testDriver != null)
+ // testDriver.tearDownClass();
}
@Before
@@ -94,31 +95,25 @@ public abstract class WSDataStoreTestBas
//methods are not called BEFORE setUpClass. I think this is a bug in
//JUnitRunner in Eclipse. Below is a workaround for that problem.
if(!setUpClassCalled) setUpClass();
-
log.info("setting up test");
- if(testDriver != null) {
- dataStore = testDriver.createDataStore(persistentKeyClass, persistentValClass);
- // webPageStore = testDriver.createDataStore(String.class, webpage.class);
- testDriver.setUp();
- } else {
- dataStore = createDataStore();
- //webPageStore = createWebPageDataStore();
-
- dataStore.truncateSchema();
- // webPageStore.truncateSchema();
+ if(dataStore == null){
+ if(testDriver != null) {
+ dataStore = testDriver.createDataStore(persistentKeyClass, persistentValClass);
+ testDriver.setUp();
+ } else {
+ dataStore = createDataStore();
+ dataStore.truncateSchema();
+ }
}
}
@After
public void tearDown() throws Exception {
log.info("tearing down test");
- if(testDriver != null) {
+ if(testDriver != null)
testDriver.tearDown();
- }
- //employeeStore.close();
- //webPageStore.close();
}
-
+
@Test
public void testNewInstance() throws IOException, Exception {
log.info("test method: testNewInstance");
@@ -128,7 +123,6 @@ public abstract class WSDataStoreTestBas
@Test
public void testCreateSchema() throws Exception {
log.info("test method: testCreateSchema");
- dataStore.createSchema();
assertSchemaExists("person");
}
@@ -149,13 +143,16 @@ public abstract class WSDataStoreTestBas
@Test
public void testTruncateSchema() throws Exception {
log.info("test method: testTruncateSchema");
- assertSchemaExists("WebPage");
+ assertSchemaExists("person");
}
@Test
public void testDeleteSchema() throws IOException, Exception {
log.info("test method: testDeleteSchema");
- //DataStoreTestUtil.testDeleteSchema(webPageStore);
+ assertDeleteSchema();
+ }
+
+ public void assertDeleteSchema(){
}
@Test
@@ -211,8 +208,12 @@ public abstract class WSDataStoreTestBas
@Test
public void testUpdate() throws IOException, Exception {
log.info("test method: testUpdate");
+ assertTestUpdateDataStore();
}
+ public void assertTestUpdateDataStore(){
+ }
+
@Test
public void testEmptyUpdate() throws IOException, Exception {
}
@@ -270,7 +271,8 @@ public abstract class WSDataStoreTestBas
log.info("test method: testDeleteByQuery");
assertTestDeleteByQueryDataStore();
}
- public void assertTestDeleteByQueryDataStore(){}
+ public void assertTestDeleteByQueryDataStore(){
+ }
@Test
public void testDeleteByQueryFields() throws IOException, Exception {
Modified: gora/branches/goraamazon/gora-dynamodb/src/examples/java/org/apache/gora/examples/generated/person.java
URL: http://svn.apache.org/viewvc/gora/branches/goraamazon/gora-dynamodb/src/examples/java/org/apache/gora/examples/generated/person.java?rev=1376707&r1=1376706&r2=1376707&view=diff
==============================================================================
--- gora/branches/goraamazon/gora-dynamodb/src/examples/java/org/apache/gora/examples/generated/person.java (original)
+++ gora/branches/goraamazon/gora-dynamodb/src/examples/java/org/apache/gora/examples/generated/person.java Thu Aug 23 21:28:16 2012
@@ -1,221 +1,97 @@
package org.apache.gora.examples.generated;
-
import java.util.Set;
-
import org.apache.gora.persistency.Persistent;
import org.apache.gora.persistency.StateManager;
-
import com.amazonaws.services.dynamodb.datamodeling.DynamoDBAttribute;
import com.amazonaws.services.dynamodb.datamodeling.DynamoDBHashKey;
import com.amazonaws.services.dynamodb.datamodeling.DynamoDBRangeKey;
import com.amazonaws.services.dynamodb.datamodeling.DynamoDBTable;
@DynamoDBTable(tableName = "person")
-public class person implements Persistent{
-
- // hash key
- private String hashKey;
-
- // range hash key
- private String rangeKey;
-
- private String firstName;
-
+public class person implements Persistent {
+ private String ssn;
+ private String date;
+
+ @DynamoDBHashKey(attributeName="ssn")
+ public String getHashKey() { return ssn; }
+ public void setHashKey(String pSsn){ this.ssn = pSsn; }
+ @DynamoDBRangeKey(attributeName="date")
+ public String getRangeKey() { return date; }
+ public void setRangeKey(String pDate){ this.date = pDate; }
+
private String lastName;
-
- private double salary;
-
- private Set<String> visitedPlaces;
-
- public void setNew(boolean pNew){}
-
- public void setDirty(boolean pDirty){}
-
- @DynamoDBHashKey(attributeName="HashKey")
- public String getHashKey() { return hashKey; }
- public void setHashKey(String pHashKey) { this.hashKey = pHashKey; }
-
- @DynamoDBRangeKey(attributeName="RangeKey")
- public String getRangeKey() { return rangeKey; }
- public void setRangeKey(String pRangeKey) { this.rangeKey = pRangeKey; }
- /*
- @DynamoDBAttribute(attributeName = "ssn")
- public String getSsn() { return ssn; }
- public void setSsn(String pSsn) { this.ssn = pSsn; }
- */
- @DynamoDBAttribute(attributeName = "FirstName")
- public String getFirstName() { return firstName; }
- public void setFirstName(String pFirstName) { this.firstName = pFirstName; }
-
@DynamoDBAttribute(attributeName = "LastName")
public String getLastName() { return lastName; }
public void setLastName(String pLastName) { this.lastName = pLastName; }
-
+
+ private Set<String> visitedplaces;
+ @DynamoDBAttribute(attributeName = "Visitedplaces")
+ public Set<String> getVisitedplaces() { return visitedplaces; }
+ public void setVisitedplaces(Set<String> pVisitedplaces) { this.visitedplaces = pVisitedplaces; }
+
+ private double salary;
@DynamoDBAttribute(attributeName = "Salary")
- public double getSalary() { return salary; }
- public void setSalary(double pSalary) { this.salary = pSalary; }
-
- @DynamoDBAttribute(attributeName = "Places")
- public Set<String> getPlacesVisited() {
- return visitedPlaces;
- }
- public void setPlacesVisited(Set<String> pVisitedPlaces) { this.visitedPlaces = pVisitedPlaces; }
-
- // TODO The persistent abstract class should not force us to rewrite all these methods
- @Override
- public StateManager getStateManager() {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public Persistent newInstance(StateManager stateManager) {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public String[] getFields() {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public String getField(int index) {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public int getFieldIndex(String field) {
- // TODO Auto-generated method stub
- return 0;
- }
-
- @Override
- public void clear() {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public person clone() {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public boolean isNew() {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public void setNew() {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void clearNew() {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public boolean isDirty() {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public boolean isDirty(int fieldIndex) {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public boolean isDirty(String field) {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public void setDirty() {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void setDirty(int fieldIndex) {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void setDirty(String field) {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void clearDirty(int fieldIndex) {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void clearDirty(String field) {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void clearDirty() {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public boolean isReadable(int fieldIndex) {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public boolean isReadable(String field) {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public void setReadable(int fieldIndex) {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void setReadable(String field) {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void clearReadable(int fieldIndex) {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void clearReadable(String field) {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void clearReadable() {
- // TODO Auto-generated method stub
-
- }
+ public double getSalary() { return salary; }
+ public void setSalary(double pSalary) { this.salary = pSalary; }
-}
+ private String firstName;
+ @DynamoDBAttribute(attributeName = "FirstName")
+ public String getFirstName() { return firstName; }
+ public void setFirstName(String pFirstName) { this.firstName = pFirstName; }
+
+
+ public void setNew(boolean pNew){}
+ public void setDirty(boolean pDirty){}
+ @Override
+ public StateManager getStateManager() { return null; }
+ @Override
+ public Persistent newInstance(StateManager stateManager) { return null; }
+ @Override
+ public String[] getFields() { return null; }
+ @Override
+ public String getField(int index) { return null; }
+ @Override
+ public int getFieldIndex(String field) { return 0; }
+ @Override
+ public void clear() { }
+ @Override
+ public person clone() { return null; }
+ @Override
+ public boolean isNew() { return false; }
+ @Override
+ public void setNew() { }
+ @Override
+ public void clearNew() { }
+ @Override
+ public boolean isDirty() { return false; }
+ @Override
+ public boolean isDirty(int fieldIndex) { return false; }
+ @Override
+ public boolean isDirty(String field) { return false; }
+ @Override
+ public void setDirty() { }
+ @Override
+ public void setDirty(int fieldIndex) { }
+ @Override
+ public void setDirty(String field) { }
+ @Override
+ public void clearDirty(int fieldIndex) { }
+ @Override
+ public void clearDirty(String field) { }
+ @Override
+ public void clearDirty() { }
+ @Override
+ public boolean isReadable(int fieldIndex) { return false; }
+ @Override
+ public boolean isReadable(String field) { return false; }
+ @Override
+ public void setReadable(int fieldIndex) { }
+ @Override
+ public void setReadable(String field) { }
+ @Override
+ public void clearReadable(int fieldIndex) { }
+ @Override
+ public void clearReadable(String field) { }
+ @Override
+ public void clearReadable() { }
+}
\ No newline at end of file
Added: gora/branches/goraamazon/gora-dynamodb/src/main/java/org/apache/gora/dynamodb/compiler/GoraDynamoDBCompiler.java
URL: http://svn.apache.org/viewvc/gora/branches/goraamazon/gora-dynamodb/src/main/java/org/apache/gora/dynamodb/compiler/GoraDynamoDBCompiler.java?rev=1376707&view=auto
==============================================================================
--- gora/branches/goraamazon/gora-dynamodb/src/main/java/org/apache/gora/dynamodb/compiler/GoraDynamoDBCompiler.java (added)
+++ gora/branches/goraamazon/gora-dynamodb/src/main/java/org/apache/gora/dynamodb/compiler/GoraDynamoDBCompiler.java Thu Aug 23 21:28:16 2012
@@ -0,0 +1,409 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/**
+ * @author Renato Marroquin Mogrovejo
+ */
+package org.apache.gora.dynamodb.compiler;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.gora.dynamodb.store.DynamoDBMapping;
+import org.apache.gora.dynamodb.store.DynamoDBMapping.DynamoDBMappingBuilder;
+import org.jdom.Document;
+import org.jdom.Element;
+import org.jdom.input.SAXBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.amazonaws.services.dynamodb.datamodeling.DynamoDBAttribute;
+import com.amazonaws.services.dynamodb.model.KeySchema;
+import com.amazonaws.services.dynamodb.model.KeySchemaElement;
+
+/** Generate specific Java classes for defined schemas. */
+public class GoraDynamoDBCompiler {
+ private File dest;
+ private Writer out;
+ private static final Logger log = LoggerFactory.getLogger(GoraDynamoDBCompiler.class);
+
+ private GoraDynamoDBCompiler(File dest) {
+ this.dest = dest; // root directory for output
+ }
+
+ /** Generates Java classes for a schema. */
+ public static void compileSchema(File src, File dest) throws IOException {
+ log.info("Compiling " + src + " to " + dest );
+ GoraDynamoDBCompiler compiler = new GoraDynamoDBCompiler(dest);
+ DynamoDBMapping dynamoDBMap = compiler.readMapping(src);
+ if (dynamoDBMap.getTables().isEmpty()) throw new IllegalStateException("There are not tables defined.");
+
+ for(String tableName : dynamoDBMap.getTables().keySet()){
+ compiler.compile(tableName, dynamoDBMap.getKeySchema(tableName), dynamoDBMap.getItems(tableName));
+ }
+ }
+
+ /**
+ * Method in charge of compiling a specific table using a key schema and a set of attributes
+ * @param pTableName Table name
+ * @param pKeySchema Key schema used
+ * @param pItems List of items belonging to a specific table
+ */
+ private void compile(String pTableName, KeySchema pKeySchema, List<Map<String, String>> pItems){
+ // TODO define where the generated will go
+ try {
+ startFile(pTableName, pTableName);
+ setHeaders(null);
+ line(0, "");
+ line(0, "@DynamoDBTable(tableName = \"" + pTableName + "\")");
+ line(0, "public class " + pTableName + " implements Persistent {");
+ setKeyAttributes(pKeySchema, 2);
+ setKeyMethods(pKeySchema, 2);
+ setItems(pItems, 2);
+ setDefaultMethods(2);
+ line(0, "}");
+ out.flush();
+ out.close();
+ } catch (IOException e) {
+ log.error("Error while compiling table " + pTableName);
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * Receives a list of all items and creates getters and setters for them
+ * @param pItems The items belonging to the table
+ * @param pIden The number of spaces used for identation
+ * @throws IOException
+ */
+ private void setItems(List<Map<String, String>> pItems, int pIden) throws IOException{
+ for(Map<String, String> item : pItems){
+ for (String itemName : item.keySet()){
+ String itemType = "String";
+ if (item.get(itemName).toString().equals("N"))
+ itemType = "double";
+ if (item.get(itemName).toString().equals("SS"))
+ itemType = "Set<String>";
+ if (item.get(itemName).toString().equals("SN"))
+ itemType = "Set<double>";
+ line(pIden, "private " + itemType + " " + itemName + ";");
+ setItemMethods(itemName, itemType, pIden);
+ }
+ }
+ line(0, "");
+ }
+
+ /**
+ * Creates item getters and setters
+ * @param pItemName Item's name
+ * @param pItemType Item's type
+ * @param pIden Number of spaces used for indentation
+ * @throws IOException
+ */
+ private void setItemMethods(String pItemName, String pItemType, int pIden) throws IOException{
+ line(pIden, "@DynamoDBAttribute(attributeName = \"" + camelCasify(pItemName) + "\")");
+ line(pIden, "public " + pItemType + " get" + camelCasify(pItemName) + "() { return " + pItemName + "; }");
+ line(pIden, "public void set" + camelCasify(pItemName) + "(" + pItemType + " p" + camelCasify(pItemName) + ") { this." + pItemName + " = p"+ camelCasify(pItemName) +"; }");
+ line(0, "");
+ }
+
+ /**
+ * Creates key getters and setters
+ * @param pKeySchema The key schema for a specific table
+ * @param pIden Number of spaces used for indentation
+ * @throws IOException
+ */
+ private void setKeyMethods(KeySchema pKeySchema, int pIden) throws IOException{
+ KeySchemaElement hashKey = pKeySchema.getHashKeyElement();
+ KeySchemaElement rangeKey = pKeySchema.getRangeKeyElement();
+ StringBuilder strBuilder = new StringBuilder();
+ // hash key
+ if(hashKey != null){
+ strBuilder.append("@DynamoDBHashKey(attributeName=\"" + hashKey.getAttributeName() + "\") \n");
+ strBuilder.append(" public String getHashKey() { return " + hashKey.getAttributeName() + "; } \n");
+ strBuilder.append(" public void setHashKey(" + (hashKey.getAttributeType().equals("S")?"String ":"double "));
+ strBuilder.append("p" + camelCasify(hashKey.getAttributeName()) + "){ this." + hashKey.getAttributeName());
+ strBuilder.append(" = p" + camelCasify(hashKey.getAttributeName()) + "; }");
+ line(pIden, strBuilder.toString());
+ }
+ strBuilder.delete(0, strBuilder.length());
+ // range key
+ if(rangeKey != null){
+ strBuilder.append("@DynamoDBRangeKey(attributeName=\"" + rangeKey.getAttributeName() + "\") \n");
+ strBuilder.append(" public String getRangeKey() { return " + rangeKey.getAttributeName() + "; } \n");
+ strBuilder.append(" public void setRangeKey(" + (rangeKey.getAttributeType().equals("S")?"String ":"double "));
+ strBuilder.append("p" + camelCasify(rangeKey.getAttributeName()) + "){ this." + rangeKey.getAttributeName());
+ strBuilder.append(" = p" + camelCasify(rangeKey.getAttributeName()) + "; }");
+ line(pIden, strBuilder.toString());
+ }
+ line(0, "");
+ }
+
+ /**
+ * Creates the key attributes within the generated class
+ * @param pKeySchema Key schema
+ * @param pIden Number of spaces used for indentation
+ * @throws IOException
+ */
+ private void setKeyAttributes(KeySchema pKeySchema, int pIden) throws IOException{
+ KeySchemaElement hashKey = pKeySchema.getHashKeyElement();
+ KeySchemaElement rangeKey = pKeySchema.getRangeKeyElement();
+ StringBuilder strBuilder = new StringBuilder();
+ // hash key
+ if(hashKey != null){
+ strBuilder.append("private " + (hashKey.getAttributeType().equals("S")?"String ":"double "));
+ strBuilder.append(hashKey.getAttributeName() + ";");
+ line(pIden, strBuilder.toString());
+ }
+ strBuilder.delete(0, strBuilder.length());
+ // range key
+ if(rangeKey != null){
+ strBuilder.append("private " + (rangeKey.getAttributeType().equals("S")?"String ":"double "));
+ strBuilder.append(rangeKey.getAttributeName() + ";");
+ line(pIden, strBuilder.toString());
+ }
+ line(0, "");
+ }
+
+ /**
+ * Returns camel case version of a string
+ * @param s String to be camelcasified
+ * @return
+ */
+ private static String camelCasify(String s) {
+ return s.substring(0, 1).toUpperCase() + s.substring(1);
+ }
+
+ /** Recognizes camel case */
+ private static String toUpperCase(String s) {
+ StringBuilder builder = new StringBuilder();
+ for(int i=0; i<s.length(); i++) {
+ if(i > 0) {
+ if(Character.isUpperCase(s.charAt(i))
+ && Character.isLowerCase(s.charAt(i-1))
+ && Character.isLetter(s.charAt(i))) {
+ builder.append("_");
+ }
+ }
+ builder.append(Character.toUpperCase(s.charAt(i)));
+ }
+ return builder.toString();
+ }
+
+ /**
+ * Starts the java generated class file
+ * @param name Class name
+ * @param space
+ * @throws IOException
+ */
+ private void startFile(String name, String space) throws IOException {
+ File dir = new File(dest, space.replace('.', File.separatorChar));
+ if (!dir.exists())
+ if (!dir.mkdirs())
+ throw new IOException("Unable to create " + dir);
+ name = cap(name) + ".java";
+ out = new OutputStreamWriter(new FileOutputStream(new File(dir, name)));
+
+ }
+
+ /**
+ * Sets the necessary imports for the generated java class to work
+ * @param namespace
+ * @throws IOException
+ */
+ private void setHeaders(String namespace) throws IOException {
+ if(namespace != null) {
+ line(0, "package "+namespace+";\n");
+ }
+ line(0, "import java.util.Set;");
+ line(0, "import org.apache.gora.persistency.Persistent;");
+ line(0, "import org.apache.gora.persistency.StateManager;");
+ line(0, "import com.amazonaws.services.dynamodb.datamodeling.DynamoDBAttribute;");
+ line(0, "import com.amazonaws.services.dynamodb.datamodeling.DynamoDBHashKey;");
+ line(0, "import com.amazonaws.services.dynamodb.datamodeling.DynamoDBRangeKey;");
+ line(0, "import com.amazonaws.services.dynamodb.datamodeling.DynamoDBTable;");
+ }
+
+ /**
+ * Creates default methods inherited from upper classes
+ * @param pIden Number of spaces used for indentation
+ * @throws IOException
+ */
+ private void setDefaultMethods(int pIden) throws IOException {
+ line(pIden, "public void setNew(boolean pNew){}");
+ line(pIden, "public void setDirty(boolean pDirty){}");
+ line(pIden, "@Override");
+ line(pIden, "public StateManager getStateManager() { return null; }");
+ line(pIden, "@Override");
+ line(pIden, "public Persistent newInstance(StateManager stateManager) { return null; }");
+ line(pIden, "@Override");
+ line(pIden, "public String[] getFields() { return null; }");
+ line(pIden, "@Override");
+ line(pIden, "public String getField(int index) { return null; }");
+ line(pIden, "@Override");
+ line(pIden, "public int getFieldIndex(String field) { return 0; }");
+ line(pIden, "@Override");
+ line(pIden, "public void clear() { }");
+ line(pIden, "@Override");
+ line(pIden, "public person clone() { return null; }");
+ line(pIden, "@Override");
+ line(pIden, "public boolean isNew() { return false; }");
+ line(pIden, "@Override");
+ line(pIden, "public void setNew() { }");
+ line(pIden, "@Override");
+ line(pIden, "public void clearNew() { }");
+ line(pIden, "@Override");
+ line(pIden, "public boolean isDirty() { return false; }");
+ line(pIden, "@Override");
+ line(pIden, "public boolean isDirty(int fieldIndex) { return false; }");
+ line(pIden, "@Override");
+ line(pIden, "public boolean isDirty(String field) { return false; }");
+ line(pIden, "@Override");
+ line(pIden, "public void setDirty() { }");
+ line(pIden, "@Override");
+ line(pIden, "public void setDirty(int fieldIndex) { }");
+ line(pIden, "@Override");
+ line(pIden, "public void setDirty(String field) { }");
+ line(pIden, "@Override");
+ line(pIden, "public void clearDirty(int fieldIndex) { }");
+ line(pIden, "@Override");
+ line(pIden, "public void clearDirty(String field) { }");
+ line(pIden, "@Override");
+ line(pIden, "public void clearDirty() { }");
+ line(pIden, "@Override");
+ line(pIden, "public boolean isReadable(int fieldIndex) { return false; }");
+ line(pIden, "@Override");
+ line(pIden, "public boolean isReadable(String field) { return false; }");
+ line(pIden, "@Override");
+ line(pIden, "public void setReadable(int fieldIndex) { }");
+ line(pIden, "@Override");
+ line(pIden, "public void setReadable(String field) { }");
+ line(pIden, "@Override");
+ line(pIden, "public void clearReadable(int fieldIndex) { }");
+ line(pIden, "@Override");
+ line(pIden, "public void clearReadable(String field) { }");
+ line(pIden, "@Override");
+ line(pIden, "public void clearReadable() { }");
+ }
+
+ /**
+ * Writes a line within the output stream
+ * @param indent Number of spaces used for indentation
+ * @param text Text to be written
+ * @throws IOException
+ */
+ private void line(int indent, String text) throws IOException {
+ for (int i = 0; i < indent; i ++) {
+ out.append(" ");
+ }
+ out.append(text);
+ out.append("\n");
+ }
+
+ /**
+ * Returns the string received with the first letter in uppercase
+ * @param name String to be converted
+ * @return
+ */
+ static String cap(String name) {
+ return name.substring(0,1).toUpperCase()+name.substring(1,name.length());
+ }
+
+ /**
+ * Start point of the compiler program
+ * @param args Receives the schema file to be compiled and where this should be written
+ * @throws Exception
+ */
+ public static void main(String[] args) throws Exception {
+ if (args.length < 2) {
+ System.err.println("Usage: Compiler <schema file> <output dir>");
+ System.exit(1);
+ }
+ compileSchema(new File(args[0]), new File(args[1]));
+ }
+
+ /**
+ * Reads the schema file and converts it into a data structure to be used
+ * @param pMapFile The schema file to be mapped into a table
+ * @return
+ * @throws IOException
+ */
+ @SuppressWarnings("unchecked")
+ private DynamoDBMapping readMapping(File pMapFile) throws IOException {
+
+ DynamoDBMappingBuilder mappingBuilder = new DynamoDBMappingBuilder();
+
+ try {
+ SAXBuilder builder = new SAXBuilder();
+ Document doc = builder.build(pMapFile);
+
+ Element root = doc.getRootElement();
+
+ List<Element> tableElements = root.getChildren("table");
+ for(Element tableElement : tableElements) {
+
+ String tableName = tableElement.getAttributeValue("name");
+ long readCapacUnits = Long.parseLong(tableElement.getAttributeValue("readcunit"));
+ long writeCapacUnits = Long.parseLong(tableElement.getAttributeValue("readcunit"));
+
+ mappingBuilder.setTableName(tableName);
+ mappingBuilder.setProvisionedThroughput(tableName, readCapacUnits, writeCapacUnits);
+ log.debug("Basic table properties have been set: Name, and Provisioned throughput.");
+
+ // Retrieving key's features
+ List<Element> fieldElements = tableElement.getChildren("key");
+ for(Element fieldElement : fieldElements) {
+ String keyName = fieldElement.getAttributeValue("name");
+ String keyType = fieldElement.getAttributeValue("type");
+ String keyAttrType = fieldElement.getAttributeValue("att-type");
+ if(keyType.equals("hash"))
+ mappingBuilder.setHashKeySchema(tableName, keyName, keyAttrType);
+ else if(keyType.equals("hashrange"))
+ mappingBuilder.setHashRangeKeySchema(tableName, keyName, keyAttrType);
+ }
+ log.debug("Table key schemas have been set.");
+
+ // Retrieving attributes
+ fieldElements = tableElement.getChildren("attribute");
+ for(Element fieldElement : fieldElements) {
+ String attributeName = fieldElement.getAttributeValue("name");
+ String attributeType = fieldElement.getAttributeValue("type");
+ mappingBuilder.addAttribute(tableName, attributeName, attributeType, 0);
+ }
+ log.info("Table attributes have been read.");
+ }
+
+ } catch(IOException ex) {
+ log.info("Error while performing xml mapping.");
+ ex.printStackTrace();
+ throw ex;
+
+ } catch(Exception ex) {
+ ex.printStackTrace();
+ throw new IOException(ex);
+ }
+
+ return mappingBuilder.build();
+ }
+}
+
Modified: gora/branches/goraamazon/gora-dynamodb/src/main/java/org/apache/gora/dynamodb/query/DynamoDBKey.java
URL: http://svn.apache.org/viewvc/gora/branches/goraamazon/gora-dynamodb/src/main/java/org/apache/gora/dynamodb/query/DynamoDBKey.java?rev=1376707&r1=1376706&r2=1376707&view=diff
==============================================================================
--- gora/branches/goraamazon/gora-dynamodb/src/main/java/org/apache/gora/dynamodb/query/DynamoDBKey.java (original)
+++ gora/branches/goraamazon/gora-dynamodb/src/main/java/org/apache/gora/dynamodb/query/DynamoDBKey.java Thu Aug 23 21:28:16 2012
@@ -1,21 +1,67 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/**
+ * @author Renato Marroquin Mogrovejo
+ */
+
package org.apache.gora.dynamodb.query;
public class DynamoDBKey<H, R> {
-
+
+ /**
+ * Hash key used for a specific table
+ */
private H hashKey;
+
+ /**
+ * Range key used for a specific table
+ */
private R rangeKey;
+ /**
+ * Gets hash key
+ * @return
+ */
public H getHashKey() {
return hashKey;
}
+
+ /**
+ * Sets hash key
+ * @param hashKey
+ */
public void setHashKey(H hashKey) {
this.hashKey = hashKey;
}
+
+ /**
+ * Gets range key
+ * @return
+ */
public R getRangeKey() {
return rangeKey;
}
+
+ /**
+ * Sets range key
+ * @param rangeKey
+ */
public void setRangeKey(R rangeKey) {
this.rangeKey = rangeKey;
}
-
}
Modified: gora/branches/goraamazon/gora-dynamodb/src/main/java/org/apache/gora/dynamodb/query/DynamoDBQuery.java
URL: http://svn.apache.org/viewvc/gora/branches/goraamazon/gora-dynamodb/src/main/java/org/apache/gora/dynamodb/query/DynamoDBQuery.java?rev=1376707&r1=1376706&r2=1376707&view=diff
==============================================================================
--- gora/branches/goraamazon/gora-dynamodb/src/main/java/org/apache/gora/dynamodb/query/DynamoDBQuery.java (original)
+++ gora/branches/goraamazon/gora-dynamodb/src/main/java/org/apache/gora/dynamodb/query/DynamoDBQuery.java Thu Aug 23 21:28:16 2012
@@ -15,6 +15,9 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+/**
+ * @author Renato Marroquin Mogrovejo
+ */
package org.apache.gora.dynamodb.query;
@@ -39,210 +42,343 @@ import com.amazonaws.services.dynamodb.m
public class DynamoDBQuery<K, T extends Persistent> extends QueryWSBase<K, T> {
- public static final Logger LOG = LoggerFactory.getLogger(DynamoDBQuery.class);
-
- private boolean consistencyReadLevel;
-
- private static ComparisonOperator rangeCompOp;
-
- private static ComparisonOperator scanCompOp;
-
- public static final String RANGE_QUERY = "range";
-
- public static final String SCAN_QUERY = "scan";
-
- private static String type;
-
- private Query<K, T> query;
-
- private Object dynamoDBExpression;
-
- private KeySchema keySchema;
-
- private K hashKey;
-
- public DynamoDBQuery(){
- super(null);
- }
+ /**
+ * Helper to write useful information into the logs
+ */
+ public static final Logger LOG = LoggerFactory.getLogger(DynamoDBQuery.class);
+
+ /**
+ * Reads consistency level
+ */
+ private boolean consistencyReadLevel;
+
+ /**
+ * Range comparator operator
+ */
+ private static ComparisonOperator rangeCompOp;
+
+ /**
+ * Scan comparator operator
+ */
+ private static ComparisonOperator scanCompOp;
+
+ /**
+ * Range query type property
+ */
+ public static final String RANGE_QUERY = "range";
+
+ /**
+ * Scan query type property
+ */
+ public static final String SCAN_QUERY = "scan";
+
+ /**
+ * Query type property
+ */
+ private static String type;
+
+ /**
+ * Generic query
+ */
+ private Query<K, T> query;
+
+ /**
+ * DynamoDB Expression to be used.
+ * This could be a range or a scan DynamoDB Expression
+ */
+ private Object dynamoDBExpression;
+
+ /**
+ * Key schema used for the query
+ */
+ private KeySchema keySchema;
+
+ /**
+ * Hash key used for the query
+ */
+ private K hashKey;
+
+ /**
+ * Default Constructor
+ */
+ public DynamoDBQuery(){
+ super(null);
+ }
- public DynamoDBQuery(DataStore<K, T> dataStore) {
- super(dataStore);
- }
-
- @Override
- public void setKey(K key) {
- this.hashKey = key;
- }
-
- @Override
- public K getKey() {
- return this.hashKey;
- }
-
- public void buildExpression(){
- AttributeValue hashAttrValue = buildKeyHashAttribute();
- if (hashAttrValue == null)
- throw new IllegalStateException("There is not a key schema defined.");
- if (DynamoDBQuery.getType().equals(RANGE_QUERY)){
- Condition newCondition = buildRangeCondition();
- buildQueryExpression(newCondition, hashAttrValue);
- }
- if (DynamoDBQuery.getType().equals(SCAN_QUERY))
- buildScanExpression(hashAttrValue);
- }
-
- public void buildScanExpression(AttributeValue pHashAttrValue){
- DynamoDBScanExpression newScanExpression = new DynamoDBScanExpression();
- // TODO right now we only support scanning using the key, but we should support other types of scans
- newScanExpression.addFilterCondition(getKeySchema().getHashKeyElement().getAttributeName(), buildKeyScanCondition());
- dynamoDBExpression = newScanExpression;
- }
-
- public void buildQueryExpression(Condition pNewCondition, AttributeValue pHashAttrValue) {
- DynamoDBQueryExpression newQueryExpression = new DynamoDBQueryExpression(pHashAttrValue);
- newQueryExpression.setConsistentRead(getConsistencyReadLevel());
- newQueryExpression.setRangeKeyCondition(pNewCondition);
- dynamoDBExpression = newQueryExpression;
- }
-
- private AttributeValue buildKeyHashAttribute(){
- String pAttrType = getKeySchema().getHashKeyElement().getAttributeType();
- if(pAttrType.equals("S"))
- return new AttributeValue().withS(getHashKey(query.getKey()).toString());
- else if(pAttrType.equals("N"))
- return new AttributeValue().withN(getHashKey(query.getKey()).toString());
- return null;
- }
-
- private Object getHashKey(K key){
- Object hashKey = null;
- try {
- // Our key may be have hash and range keys
- for (Method met :key.getClass().getDeclaredMethods()){
- if(met.getName().equals("getHashKey")){
- Object [] params = null;
- hashKey = met.invoke(key, params);
- break;
- }
- }
- } catch (IllegalArgumentException e) {
- LOG.info("DynamoDBStore: Error while trying to fetch range key.");
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- LOG.info("DynamoDBStore: Error while trying to fetch range key.");
- e.printStackTrace();
- } catch (InvocationTargetException e) {
- LOG.info("DynamoDBStore: Error while trying to fetch range key.");
- e.printStackTrace();
- }
- return hashKey;
- }
-
- private Object getRangeKey(K key){
- Object rangeKey = null;
- try {
- // Our key may be have hash and range keys
- for (Method met :key.getClass().getDeclaredMethods()){
- if(met.getName().equals("getRangeKey")){
- Object [] params = null;
- rangeKey = met.invoke(key, params);
- break;
- }
- }
- } catch (IllegalArgumentException e) {
- LOG.info("DynamoDBStore: Error while trying to fetch range key.");
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- LOG.info("DynamoDBStore: Error while trying to fetch range key.");
- e.printStackTrace();
- } catch (InvocationTargetException e) {
- LOG.info("DynamoDBStore: Error while trying to fetch range key.");
- e.printStackTrace();
- }
- return rangeKey;
+ /**
+ * Constructor
+ * @param dataStore
+ */
+ public DynamoDBQuery(DataStore<K, T> dataStore) {
+ super(dataStore);
+ }
+
+ /**
+ * Sets hash key
+ */
+ @Override
+ public void setKey(K key) {
+ this.hashKey = key;
+ }
+
+ /**
+ * Gets hash key
+ */
+ @Override
+ public K getKey() {
+ return this.hashKey;
+ }
+
+ /**
+ * Builds query expression depending on query type (range or scan)
+ */
+ public void buildExpression(){
+ AttributeValue hashAttrValue = buildKeyHashAttribute();
+ if (hashAttrValue == null)
+ throw new IllegalStateException("There is not a key schema defined.");
+ if (DynamoDBQuery.getType().equals(RANGE_QUERY)){
+ Condition newCondition = buildRangeCondition();
+ buildQueryExpression(newCondition, hashAttrValue);
+ }
+ if (DynamoDBQuery.getType().equals(SCAN_QUERY))
+ buildScanExpression(hashAttrValue);
+ }
+
+ /**
+ * Builds scan query expression using a hash attribute value where to start
+ * @param pHashAttrValue Hash attribute value where to start scanning
+ */
+ public void buildScanExpression(AttributeValue pHashAttrValue){
+ DynamoDBScanExpression newScanExpression = new DynamoDBScanExpression();
+ // TODO right now we only support scanning using the key, but we should support other types of scans
+ newScanExpression.addFilterCondition(getKeySchema().getHashKeyElement().getAttributeName(), buildKeyScanCondition());
+ dynamoDBExpression = newScanExpression;
+ }
+
+ /**
+ * Builds range query expression
+ * @param pNewCondition Condition for querying
+ * @param pHashAttrValue Hash attribute value where to start
+ */
+ public void buildQueryExpression(Condition pNewCondition, AttributeValue pHashAttrValue) {
+ DynamoDBQueryExpression newQueryExpression = new DynamoDBQueryExpression(pHashAttrValue);
+ newQueryExpression.setConsistentRead(getConsistencyReadLevel());
+ newQueryExpression.setRangeKeyCondition(pNewCondition);
+ dynamoDBExpression = newQueryExpression;
+ }
+
+ /**
+ * Builds hash key attribute from generic query received
+ * @return AttributeValue build from query
+ */
+ private AttributeValue buildKeyHashAttribute(){
+ String pAttrType = getKeySchema().getHashKeyElement().getAttributeType();
+ if(pAttrType.equals("S"))
+ return new AttributeValue().withS(getHashKey(query.getKey()).toString());
+ else if(pAttrType.equals("N"))
+ return new AttributeValue().withN(getHashKey(query.getKey()).toString());
+ return null;
+ }
+
+ /**
+ * Gets hash key for querying
+ * @param key
+ * @return
+ */
+ private Object getHashKey(K key){
+ Object hashKey = null;
+ try {
+ // Our key may be have hash and range keys
+ for (Method met :key.getClass().getDeclaredMethods()){
+ if(met.getName().equals("getHashKey")){
+ Object [] params = null;
+ hashKey = met.invoke(key, params);
+ break;
+ }
}
-
- private Condition buildKeyScanCondition(){
- Condition scanKeyCondition = new Condition();
- scanKeyCondition.setComparisonOperator(getScanCompOp());
- scanKeyCondition.withAttributeValueList(buildKeyHashAttribute());
- return scanKeyCondition;
+ } catch (IllegalArgumentException e) {
+ LOG.info("DynamoDBStore: Error while trying to fetch range key.");
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ LOG.info("DynamoDBStore: Error while trying to fetch range key.");
+ e.printStackTrace();
+ } catch (InvocationTargetException e) {
+ LOG.info("DynamoDBStore: Error while trying to fetch range key.");
+ e.printStackTrace();
}
-
- private Condition buildRangeCondition(){
- KeySchemaElement kRangeSchema = getKeySchema().getRangeKeyElement();
- Condition rangeKeyCondition = null;
- if(kRangeSchema != null){
- rangeKeyCondition = new Condition();
- rangeKeyCondition.setComparisonOperator(ComparisonOperator.BETWEEN.toString());
- AttributeValue startVal = null, endVal = null;
- //startVal = buildKeyHashAttribute();
- if(kRangeSchema.getAttributeType().equals("S")){
- startVal = new AttributeValue().withS(getRangeKey(query.getStartKey()).toString());
- endVal = new AttributeValue().withS(getRangeKey(query.getEndKey()).toString());
- }
- else if (kRangeSchema.getAttributeType().equals("N")){
- startVal = new AttributeValue().withN(getRangeKey(query.getStartKey()).toString());
- endVal = new AttributeValue().withN(getRangeKey(query.getEndKey()).toString());
- }
- rangeKeyCondition.withAttributeValueList(startVal, endVal);
+ return hashKey;
+ }
+
+ /**
+ * Gets range key for querying from generic query object received
+ * @param key
+ * @return
+ */
+ private Object getRangeKey(K key){
+ Object rangeKey = null;
+ try {
+ // Our key may be have hash and range keys
+ for (Method met :key.getClass().getDeclaredMethods()){
+ if(met.getName().equals("getRangeKey")){
+ Object [] params = null;
+ rangeKey = met.invoke(key, params);
+ break;
+ }
+ }
+ } catch (IllegalArgumentException e) {
+ LOG.info("DynamoDBStore: Error while trying to fetch range key.");
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ LOG.info("DynamoDBStore: Error while trying to fetch range key.");
+ e.printStackTrace();
+ } catch (InvocationTargetException e) {
+ LOG.info("DynamoDBStore: Error while trying to fetch range key.");
+ e.printStackTrace();
+ }
+ return rangeKey;
+ }
+
+ /**
+ * Builds key scan condition using scan comparator, and hash key attribute
+ * @return
+ */
+ private Condition buildKeyScanCondition(){
+ Condition scanKeyCondition = new Condition();
+ scanKeyCondition.setComparisonOperator(getScanCompOp());
+ scanKeyCondition.withAttributeValueList(buildKeyHashAttribute());
+ return scanKeyCondition;
+ }
+
+ /**
+ * Builds range condition based on elements set
+ * @return
+ */
+ private Condition buildRangeCondition(){
+ KeySchemaElement kRangeSchema = getKeySchema().getRangeKeyElement();
+ Condition rangeKeyCondition = null;
+ if(kRangeSchema != null){
+ rangeKeyCondition = new Condition();
+ rangeKeyCondition.setComparisonOperator(ComparisonOperator.BETWEEN.toString());
+ AttributeValue startVal = null, endVal = null;
+ //startVal = buildKeyHashAttribute();
+ if(kRangeSchema.getAttributeType().equals("S")){
+ startVal = new AttributeValue().withS(getRangeKey(query.getStartKey()).toString());
+ endVal = new AttributeValue().withS(getRangeKey(query.getEndKey()).toString());
}
- return rangeKeyCondition;
- }
-
- public boolean getConsistencyReadLevel(){
- return consistencyReadLevel;
- }
-
- public void setConsistencyReadLevel(boolean pConsistencyReadLevel){
- this.consistencyReadLevel = pConsistencyReadLevel;
- }
-
- public KeySchema getKeySchema(){
- return keySchema;
- }
-
- public Object getQueryExpression(){
- return dynamoDBExpression;
- }
-
- public void setKeySchema(KeySchema pKeySchema){
- this.keySchema = pKeySchema;
- }
-
- public void setQuery(Query<K, T> pQuery){
- this.query = pQuery;
- }
-
- public Query<K, T> getQuery(){
- return this.query;
- }
-
- public static String getType() {
- return type;
- }
-
- public static void setType(String pType) {
- type = pType;
+ else if (kRangeSchema.getAttributeType().equals("N")){
+ startVal = new AttributeValue().withN(getRangeKey(query.getStartKey()).toString());
+ endVal = new AttributeValue().withN(getRangeKey(query.getEndKey()).toString());
+ }
+ rangeKeyCondition.withAttributeValueList(startVal, endVal);
}
+ return rangeKeyCondition;
+ }
- public static ComparisonOperator getScanCompOp() {
- if (scanCompOp == null)
- scanCompOp = ComparisonOperator.GE;
- return scanCompOp;
- }
+ /**
+ * Gets read consistency level
+ * @return
+ */
+ public boolean getConsistencyReadLevel(){
+ return consistencyReadLevel;
+ }
+
+ /**
+ * Sets read consistency level
+ * @param pConsistencyReadLevel
+ */
+ public void setConsistencyReadLevel(boolean pConsistencyReadLevel){
+ this.consistencyReadLevel = pConsistencyReadLevel;
+ }
+
+ /**
+ * Gets key schema
+ * @return
+ */
+ public KeySchema getKeySchema(){
+ return keySchema;
+ }
- public static void setScanCompOp(ComparisonOperator scanCompOp) {
- DynamoDBQuery.scanCompOp = scanCompOp;
- }
-
- public static ComparisonOperator getRangeCompOp(){
- if (rangeCompOp == null)
- rangeCompOp = ComparisonOperator.BETWEEN;
- return rangeCompOp;
- }
-
- public static void setRangeCompOp(ComparisonOperator pRangeCompOp){
- rangeCompOp = pRangeCompOp;
- }
+ /**
+ * Gets query expression for query
+ * @return
+ */
+ public Object getQueryExpression(){
+ return dynamoDBExpression;
+ }
+
+ /**
+ * Sets query key schema used for queying
+ * @param pKeySchema
+ */
+ public void setKeySchema(KeySchema pKeySchema){
+ this.keySchema = pKeySchema;
+ }
+
+ /**
+ * Sets query to be performed
+ * @param pQuery
+ */
+ public void setQuery(Query<K, T> pQuery){
+ this.query = pQuery;
+ }
+
+ /**
+ * Gets query performed
+ * @return
+ */
+ public Query<K, T> getQuery(){
+ return this.query;
+ }
+
+ /**
+ * Gets query type
+ * @return
+ */
+ public static String getType() {
+ return type;
+ }
+
+ /**
+ * Sets query type
+ * @param pType
+ */
+ public static void setType(String pType) {
+ type = pType;
+ }
+
+ /**
+ * Gets scan comparator operator
+ * @return
+ */
+ public static ComparisonOperator getScanCompOp() {
+ if (scanCompOp == null)
+ scanCompOp = ComparisonOperator.GE;
+ return scanCompOp;
+ }
+
+ /**
+ * Sets scan query comparator operator
+ * @param scanCompOp
+ */
+ public static void setScanCompOp(ComparisonOperator scanCompOp) {
+ DynamoDBQuery.scanCompOp = scanCompOp;
+ }
+
+ /**
+ * Gets range query comparator operator
+ * @return
+ */
+ public static ComparisonOperator getRangeCompOp(){
+ if (rangeCompOp == null)
+ rangeCompOp = ComparisonOperator.BETWEEN;
+ return rangeCompOp;
+ }
+
+ /**
+ * Sets range query comparator operator
+ * @param pRangeCompOp
+ */
+ public static void setRangeCompOp(ComparisonOperator pRangeCompOp){
+ rangeCompOp = pRangeCompOp;
+ }
}
Modified: gora/branches/goraamazon/gora-dynamodb/src/main/java/org/apache/gora/dynamodb/query/DynamoDBResult.java
URL: http://svn.apache.org/viewvc/gora/branches/goraamazon/gora-dynamodb/src/main/java/org/apache/gora/dynamodb/query/DynamoDBResult.java?rev=1376707&r1=1376706&r2=1376707&view=diff
==============================================================================
--- gora/branches/goraamazon/gora-dynamodb/src/main/java/org/apache/gora/dynamodb/query/DynamoDBResult.java (original)
+++ gora/branches/goraamazon/gora-dynamodb/src/main/java/org/apache/gora/dynamodb/query/DynamoDBResult.java Thu Aug 23 21:28:16 2012
@@ -15,6 +15,9 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+/**
+ * @author Renato Marroquin Mogrovejo
+ */
package org.apache.gora.dynamodb.query;
@@ -29,26 +32,50 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class DynamoDBResult<K, T extends Persistent> extends ResultWSBase<K, T> {
+
+ /**
+ * Helper to write useful information into the logs
+ */
public static final Logger LOG = LoggerFactory.getLogger(DynamoDBResult.class);
+ /**
+ * Result set containing query results
+ */
private List<T> dynamoDBResultSet;
+ /**
+ * Constructor for the result set
+ * @param dataStore Data store used
+ * @param query Query used
+ * @param objList Objects obtained from querying
+ */
public DynamoDBResult(DataStore<K, T> dataStore, Query<K, T> query, List<T> objList) {
super(dataStore, query);
LOG.debug("DynamoDB result created.");
this.setResultSet(objList);
}
+ /**
+ * Sets the resulting objects within the class
+ * @param objList
+ */
public void setResultSet(List<T> objList) {
this.dynamoDBResultSet = objList;
this.limit = objList.size();
}
+ /**
+ * Gets the items reading progress
+ */
public float getProgress() throws IOException, InterruptedException, Exception {
- // TODO Auto-generated method stub
- return 0;
+ if (this.limit <= 0 || this.offset <= 0)
+ return 0;
+ return this.limit/this.offset;
}
+ /**
+ * Gets the next item
+ */
protected boolean nextInner() throws Exception {
if (offset < 0 || offset > ( dynamoDBResultSet.size() - 1))
return false;
Modified: gora/branches/goraamazon/gora-dynamodb/src/main/java/org/apache/gora/dynamodb/store/DynamoDBMapping.java
URL: http://svn.apache.org/viewvc/gora/branches/goraamazon/gora-dynamodb/src/main/java/org/apache/gora/dynamodb/store/DynamoDBMapping.java?rev=1376707&r1=1376706&r2=1376707&view=diff
==============================================================================
--- gora/branches/goraamazon/gora-dynamodb/src/main/java/org/apache/gora/dynamodb/store/DynamoDBMapping.java (original)
+++ gora/branches/goraamazon/gora-dynamodb/src/main/java/org/apache/gora/dynamodb/store/DynamoDBMapping.java Thu Aug 23 21:28:16 2012
@@ -15,7 +15,9 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
+/**
+ * @author Renato Marroquin Mogrovejo
+ */
package org.apache.gora.dynamodb.store;
import java.util.ArrayList;
@@ -32,15 +34,32 @@ import com.amazonaws.services.dynamodb.m
public class DynamoDBMapping {
+ /**
+ * Helper to write useful information into the logs
+ */
public static final Logger LOG = LoggerFactory.getLogger(DynamoDBMapping.class);
- // a map from field name to attribute value
+ /**
+ * a map from field name to attribute value
+ */
private final Map<String, List<Map<String, String>>> tablesToItems;
+ /**
+ * Maps tables to their own key schemas
+ */
private final Map<String, KeySchema> tablesToKeySchemas;
+ /**
+ * Maps tables to their provisioned throughput
+ */
private final Map<String, ProvisionedThroughput> tablesToPrTh;
+ /**
+ * Constructor for DynamoDBMapping
+ * @param tables Tables mapped.
+ * @param tablesToKeySchemas KeySchemas used within tables mapped.
+ * @param provisionedThroughput Provisioned throughput used within tables mapped.
+ */
public DynamoDBMapping(Map<String, List<Map<String, String>>> tables,
Map<String, KeySchema> tablesToKeySchemas,
Map<String, ProvisionedThroughput> provisionedThroughput) {
@@ -49,21 +68,41 @@ public class DynamoDBMapping {
this.tablesToPrTh = provisionedThroughput;
}
+ /**
+ * Gets the tables with their own items
+ * @return tablesToItem HashMap
+ */
public Map<String,List<Map<String, String>>> getTables(){
return tablesToItems;
}
+ /**
+ * Gets items or attributes from a specific table
+ * @param tableName Table name to determine which attributes to get
+ * @return
+ */
public List<Map<String, String>> getItems(String tableName){
return tablesToItems.get(tableName);
}
-
+
+ /**
+ * Gets the key schema from a specific table
+ * @param tableName Table name to determine which key schema to get
+ * @return
+ */
public KeySchema getKeySchema(String tableName) {
return tablesToKeySchemas.get(tableName);
}
+ /**
+ * Gets the provisioned throughput from a specific table
+ * @param tableName Table name to determine which provisioned throughput to get
+ * @return
+ */
public ProvisionedThroughput getProvisionedThroughput(String tableName){
return tablesToPrTh.get(tableName);
}
+
/**
* A builder for creating the mapper. This will allow building a thread safe
* {@link DynamoDBMapping} using simple immutabilty.
@@ -71,6 +110,9 @@ public class DynamoDBMapping {
*/
public static class DynamoDBMappingBuilder {
+ /**
+ * Table name to be used to build the DynamoDBMapping object
+ */
private String tableName;
/**
@@ -90,6 +132,11 @@ public class DynamoDBMapping {
tableName = tabName;
}
+ /**
+ * Gets the table name for which the table is being mapped
+ * @param tableName
+ * @return
+ */
public String getTableName(String tableName){
return tableName;
}
@@ -179,6 +226,13 @@ public class DynamoDBMapping {
}
+ /**
+ * Adds an attribute to an specific item
+ * @param tableName
+ * @param attributeName
+ * @param attrType
+ * @param itemNumber
+ */
public void addAttribute(String tableName, String attributeName, String attrType, int itemNumber) {
// selecting table
List<Map<String, String>> items = getOrCreateTable(tableName);
@@ -189,6 +243,7 @@ public class DynamoDBMapping {
// add item to table
//tablesToItems.put(tableName, items);
}
+
/**
* Method to verify whether or not the schemas have been initialized
* @return
@@ -209,6 +264,11 @@ public class DynamoDBMapping {
}
+ /**
+ * Verifies is a table has a key schema defined
+ * @param tableName Table name to determine which key schema to obtain
+ * @return
+ */
private boolean verifyKeySchema(String tableName){
KeySchema kSchema = tablesToKeySchemas.get(tableName);
@@ -231,6 +291,7 @@ public class DynamoDBMapping {
}
/**
+ * Constructs the DynamoDBMapping object
* @return A newly constructed mapping.
*/
public DynamoDBMapping build() {
@@ -248,5 +309,4 @@ public class DynamoDBMapping {
return new DynamoDBMapping(tablesToItems,tablesToKeySchemas, tablesToPrTh);
}
}
-
}