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);
 	  }
   }
-
 }