// 2013-02-13 johnpfeiffer
//TODO: handle UTF8?
package net.kittyandbear;
import java.text.SimpleDateFormat;
import java.util.Map;
import java.util.TimeZone;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.dynamodb.AmazonDynamoDBClient;
import com.amazonaws.services.dynamodb.model.AttributeValue;
import com.amazonaws.services.dynamodb.model.ComparisonOperator;
import com.amazonaws.services.dynamodb.model.Condition;
import com.amazonaws.services.dynamodb.model.Key;
import com.amazonaws.services.dynamodb.model.QueryRequest;
import com.amazonaws.services.dynamodb.model.QueryResult;
public class DynamoDBQuery {
public static final String CLASSVERSION = "0.1";
protected static final int MINIMUMPARAMETERS = 6;
protected static final int MAXIMUMPARAMETERS = 6;
public static final String CORRECTUSAGE = "java -jar DynamoDBQuery-" + DynamoDBQuery.CLASSVERSION + ".jar "
+ "accessKey secretKey tableName hashKey startTimeInUnixEpochSeconds endTimeInUnixEpochSeconds";
private static String accessKey;
private static String secretKey;
private static String dynamoTableName;
private static String hashKey;
private static AmazonDynamoDBClient dynamoDB = null;
private static void getEventsForKeyInTimeRange( String tableName, String hashKey, long timestampStart, long timestampEnd ) {
Key lastKeyEvaluated = null;
do {
Condition rangeKeyCondition = new Condition().withComparisonOperator( ComparisonOperator.BETWEEN.toString() )
.withAttributeValueList( new AttributeValue().withN( String.valueOf( timestampStart ) ),
new AttributeValue().withN( String.valueOf( timestampEnd ) ) );
QueryRequest queryRequest = new QueryRequest().withTableName( tableName )
.withHashKeyValue( new AttributeValue().withS( hashKey ) ).withRangeKeyCondition( rangeKeyCondition )
.withLimit( 100 ).withExclusiveStartKey( lastKeyEvaluated );
QueryResult result = dynamoDB.query( queryRequest );
for( Map<String, AttributeValue> item : result.getItems() ) {
System.out.println( "----- ENTRY ---- ");
System.out.println( item.toString() );
}
lastKeyEvaluated = result.getLastEvaluatedKey();
} while( lastKeyEvaluated != null );
}
private static String timestampMillisecondsToDateString( long timestamp ) {
SimpleDateFormat utcFormat = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" );
utcFormat.setTimeZone( TimeZone.getTimeZone( "UTC" ) );
return utcFormat.format( timestamp ) + " UTC";
}
private static void connectToDynamoDB() throws Exception {
AWSCredentials credentials = new BasicAWSCredentials( accessKey, secretKey );
dynamoDB = new AmazonDynamoDBClient( credentials );
}
static public void main( String args[] ) throws Exception {
if( argsAreInvalid( args ) ) {
System.out.println( "ERROR: " + args.length + " Incorrect number of parameters, " + CORRECTUSAGE );
System.exit( 1 );
}
for( int i = 0; i < args.length ; i++ )
{
System.out.println( args[i] );
}
accessKey = args[0];
secretKey = args[1];
dynamoTableName = args[2];
hashKey = args[3];
DynamoDBQuery.connectToDynamoDB();
String timestampStartString = args[4 ]; // http://epochconverter.com for Human Date to Unix Epoch
String timestampEndString = args[5 ];
long timestampStartMilliseconds = Long.parseLong( timestampStartString ) * 1000; //Java uses milliseconds
long timestampEndMilliseconds = Long.parseLong( timestampEndString ) * 1000;
long timestampStartMicroseconds = timestampStartMilliseconds * 1000; //DynamoDB uses microseconds
long timestampEndMicroseconds = timestampEndMilliseconds * 1000;
System.out.println( "\nSearching " + dynamoTableName + " for " + hashKey +
" between " + DynamoDBQuery.timestampMillisecondsToDateString( timestampStartMilliseconds ) + " and " + DynamoDBQuery.timestampMillisecondsToDateString( timestampEndMilliseconds ) );
DynamoDBQuery.getEventsForKeyInTimeRange( dynamoTableName , hashKey, timestampStartMicroseconds , timestampEndMicroseconds );
System.out.println( "done");
}
private static boolean argsAreInvalid( String args[] ) {
boolean areInvalid = true;
if( args != null && args.length >= MINIMUMPARAMETERS & args.length <= MAXIMUMPARAMETERS ) {
areInvalid = false;
}
return areInvalid;
}
} // end class