protected ItemCollection<QueryOutcome> doQuery(QuerySpec spec) { QueryRequest req = spec.getRequest().withTableName(tableName);
@Override public Map<String, List<SchemaField>> getCollections(String project) { QueryResult query = dynamoDBClient.query(new QueryRequest() .withTableName(tableConfig.getTableName()) .withKeyConditions(ImmutableMap.of("project", new Condition() .withComparisonOperator(EQ) .withAttributeValueList(new AttributeValue(project))))); Map<String, List<SchemaField>> builder = new HashMap(); for (Map<String, AttributeValue> entry : query.getItems()) { if (entry.get("id").getS().equals("|")) { continue; } builder.computeIfAbsent(entry.get("collection").getS(), (k) -> new ArrayList<>()).add(new SchemaField( entry.get("name").getS(), FieldType.valueOf(entry.get("type").getS()))); } return builder; }
@Override public CompletableFuture<QueryResult> searchUsers(RequestContext context, List<String> columns, Expression filterExpression, List<EventFilter> eventFilter, Sorting sortColumn, long limit, String offset) { QueryRequest scanRequest = new QueryRequest() .withTableName(tableConfig.getTableName()); if (columns != null && !columns.isEmpty()) { scanRequest.withAttributesToGet(columns.stream().map(e -> "properties." + e).collect(Collectors.toList()));
@Override public List<SchemaField> getCollection(String project, String collection) { QueryResult query = dynamoDBClient.query(new QueryRequest() .withTableName(tableConfig.getTableName()) .withKeyConditions(ImmutableMap.of("project", new Condition().withComparisonOperator(EQ).withAttributeValueList(new AttributeValue(project)))) .withQueryFilter( ImmutableMap.of("collection", new Condition().withComparisonOperator(EQ) .withAttributeValueList(new AttributeValue(collection))))); return query.getItems().stream() .filter(e -> !e.get("id").getS().equals("|")) .map(e -> new SchemaField(e.get("name").getS(), FieldType.valueOf(e.get("type").getS()))) .collect(Collectors.toList()); }
@Override public void deleteProject(String project) { dynamoDBClient.deleteItem(new DeleteItemRequest() .withTableName(tableConfig.getTableName()) .withKey( new AbstractMap.SimpleEntry<>("project", new AttributeValue(project)), new AbstractMap.SimpleEntry<>("id", new AttributeValue("|")))); for (int i = 0; i < 100; i++) { List<Map<String, AttributeValue>> items = dynamoDBClient.query(new QueryRequest() .withTableName(tableConfig.getTableName()) .withKeyConditions(ImmutableMap.of("project", new Condition().withComparisonOperator(EQ) .withAttributeValueList(new AttributeValue(project))))).getItems(); if (items == null || items.isEmpty()) { return; } for (Map<String, AttributeValue> item : items) { dynamoDBClient.deleteItem(new DeleteItemRequest() .withTableName(tableConfig.getTableName()) .withKey( new AbstractMap.SimpleEntry<>("project", new AttributeValue(project)), new AbstractMap.SimpleEntry<>("id", new AttributeValue(item.get("id").getS())))); } } throw new RakamException("Unable to delete project", HttpResponseStatus.INTERNAL_SERVER_ERROR); }
.withAttributesToGet(attributesToGet) .withLimit(limit) .withTableName(tableName) .withConsistentRead(isConsistentRead) .withIndexName(this.indexName);
final QueryRequest request = new QueryRequest(); request.withExclusiveStartKey(nextKey) .withTableName(tableName) .withSelect(Select.COUNT) .withConsistentRead(isConsistentRead)
protected QueryRequest createQueryRequest() { return new QueryRequest() .withTableName(tableName) .withConsistentRead(forceConsistentRead) .withReturnConsumedCapacity(ReturnConsumedCapacity.TOTAL); } protected ScanRequest createScanRequest() {
Condition hashKeyCondition = new Condition(); hashKeyCondition.withComparisonOperator(ComparisonOperator.EQ).withAttributeValueList(new AttributeValue().withS(hashKeyAttributeValue)); Condition rangeKeyCondition = new Condition(); rangeKeyCondition.withComparisonOperator(ComparisonOperator.GT).withAttributeValueList(new AttributeValue().withN(timestamp.toString())); Map<String, Condition> keyConditions = new HashMap<String, Condition>(); keyConditions.put(MappedItem.INDEXED_ATTRIBUTE_NAME, hashKeyCondition); keyConditions.put(MappedItem.TIMESTAMP, rangeKeyCondition); QueryRequest queryRequest = new QueryRequest(); queryRequest.withTableName(tableName); queryRequest.withIndexName(MappedItem.INDEX_NAME); queryRequest.withKeyConditions(keyConditions); QueryResult result = amazonDynamoDBClient.query(queryRequest); List<MappedItem> mappedItems = new ArrayList<MappedItem>(); for(Map<String, AttributeValue> item : result.getItems()) { MappedItem mappedItem = dynamoDBMapper.marshallIntoObject(MappedItem.class, item); mappedItems.add(mappedItem); } return mappedItems;
private static long getLastId(String tableName, String instanceName, AmazonDynamoDB dynamoClient) { QueryRequest queryRequest = new QueryRequest().withTableName(tableName) .withKeyConditionExpression("instance = :pk") .addExpressionAttributeValuesEntry(":pk", new AttributeValue().withS(instanceName)) .withScanIndexForward(false).withLimit(1); QueryResult result = dynamoClient.query(queryRequest); List<Map<String, AttributeValue>> items = result.getItems(); if (items == null || items.size() == 0) { return 0L; } else { return Long.valueOf(items.get(0).get("id").getN()); } }
private static void findRepliesInLast15DaysWithConfig(String forumName, String threadSubject) { long twoWeeksAgoMilli = (new Date()).getTime() - (15L*24L*60L*60L*1000L); Date twoWeeksAgo = new Date(); twoWeeksAgo.setTime(twoWeeksAgoMilli); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); String twoWeeksAgoStr = df.format(twoWeeksAgo); Condition rangeKeyCondition = new Condition() .withComparisonOperator(ComparisonOperator.GT.toString()) .withAttributeValueList(new AttributeValue().withS(twoWeeksAgoStr)); Map<String, Condition> keyConditions = makeReplyKeyConditions(forumName, threadSubject); keyConditions.put("ReplyDateTime", rangeKeyCondition); QueryRequest queryRequest = new QueryRequest().withTableName(tableName) .withKeyConditions(keyConditions) .withProjectionExpression("Message, ReplyDateTime, PostedBy"); QueryResult result = client.query(queryRequest); for (Map<String, AttributeValue> item : result.getItems()) { printItem(item); } }
private static void findRepliesPostedWithinTimePeriod(String forumName, String threadSubject) { long startDateMilli = (new Date()).getTime() - (15L*24L*60L*60L*1000L); long endDateMilli = (new Date()).getTime() - (5L*24L*60L*60L*1000L); java.text.SimpleDateFormat df = new java.text.SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); String startDate = df.format(startDateMilli); String endDate = df.format(endDateMilli); Condition rangeKeyCondition = new Condition() .withComparisonOperator(ComparisonOperator.BETWEEN.toString()) .withAttributeValueList( new AttributeValue().withS(startDate), new AttributeValue().withS(endDate)); Map<String, Condition> keyConditions = makeReplyKeyConditions(forumName, threadSubject); keyConditions.put("ReplyDateTime", rangeKeyCondition); QueryRequest queryRequest = new QueryRequest() .withTableName(tableName) .withKeyConditions(keyConditions) .withProjectionExpression("Message, ReplyDateTime, PostedBy"); QueryResult result = client.query(queryRequest); for (Map<String, AttributeValue> item : result.getItems()) { printItem(item); } }
@Override public long getMaxVersion(final String materialName) { final List<Map<String, AttributeValue>> items = ddb.query( new QueryRequest() .withTableName(tableName) .withConsistentRead(Boolean.TRUE) .withKeyConditions( Collections.singletonMap( DEFAULT_HASH_KEY, new Condition().withComparisonOperator( ComparisonOperator.EQ).withAttributeValueList( new AttributeValue().withS(materialName)))) .withLimit(1).withScanIndexForward(false) .withAttributesToGet(DEFAULT_RANGE_KEY)).getItems(); if (items.isEmpty()) { return -1L; } else { return Long.parseLong(items.get(0).get(DEFAULT_RANGE_KEY).getN()); } }
private static void findRepliesForAThread(String forumName, String threadSubject) { String replyId = forumName + "#" + threadSubject; Condition hashKeyCondition = new Condition() .withComparisonOperator(ComparisonOperator.EQ) .withAttributeValueList(new AttributeValue().withS(replyId)); Map<String, Condition> keyConditions = new HashMap<String, Condition>(); keyConditions.put("Id", hashKeyCondition); QueryRequest queryRequest = new QueryRequest() .withTableName(tableName) .withKeyConditions(keyConditions); QueryResult result = client.query(queryRequest); for (Map<String, AttributeValue> item : result.getItems()) { printItem(item); } }
@Override public long getMaxVersion(final String materialName) { final List<Map<String, AttributeValue>> items = ddb.query( new QueryRequest() .withTableName(tableName) .withConsistentRead(Boolean.TRUE) .withKeyConditions( Collections.singletonMap( DEFAULT_HASH_KEY, new Condition().withComparisonOperator( ComparisonOperator.EQ).withAttributeValueList( new AttributeValue().withS(materialName)))) .withLimit(1).withScanIndexForward(false) .withAttributesToGet(DEFAULT_RANGE_KEY)).getItems(); if (items.isEmpty()) { return -1L; } else { return Long.parseLong(items.get(0).get(DEFAULT_RANGE_KEY).getN()); } }
private static void findRepliesUsingAFilterExpression(String forumName, String threadSubject) { Map<String, Condition> keyConditions = makeReplyKeyConditions(forumName, threadSubject); Map<String, AttributeValue> expressionAttributeValues = new HashMap<String, AttributeValue>(); expressionAttributeValues.put(":val", new AttributeValue().withS("User B")); QueryRequest queryRequest = new QueryRequest() .withTableName(tableName) .withKeyConditions(keyConditions) .withFilterExpression("PostedBy = :val") .withExpressionAttributeValues(expressionAttributeValues) .withProjectionExpression("Message, ReplyDateTime, PostedBy"); QueryResult result = client.query(queryRequest); for (Map<String, AttributeValue> item : result.getItems()) { printItem(item); } }
public RetryResult<QueryResult> queryTable( String tableName, DynamoDBQueryFilter dynamoDBQueryFilter, Map<String, AttributeValue> exclusiveStartKey, long limit, Reporter reporter) { final QueryRequest queryRequest = new QueryRequest() .withTableName(tableName) .withExclusiveStartKey(exclusiveStartKey) .withKeyConditions(dynamoDBQueryFilter.getKeyConditions()) .withLimit(Ints.checkedCast(limit)) .withReturnConsumedCapacity(ReturnConsumedCapacity.TOTAL); RetryResult<QueryResult> retryResult = getRetryDriver().runWithRetry( new Callable<QueryResult>() { @Override public QueryResult call() { log.debug("Executing DynamoDB query: " + queryRequest); return dynamoDB.query(queryRequest); } }, reporter, PrintCounter.DynamoDBReadThrottle); return retryResult; }
public RetryResult<QueryResult> queryTable( String tableName, DynamoDBQueryFilter dynamoDBQueryFilter, Map<String, AttributeValue> exclusiveStartKey, long limit, Reporter reporter) { final QueryRequest queryRequest = new QueryRequest() .withTableName(tableName) .withExclusiveStartKey(exclusiveStartKey) .withKeyConditions(dynamoDBQueryFilter.getKeyConditions()) .withLimit(Ints.checkedCast(limit)) .withReturnConsumedCapacity(ReturnConsumedCapacity.TOTAL); RetryResult<QueryResult> retryResult = getRetryDriver().runWithRetry( new Callable<QueryResult>() { @Override public QueryResult call() { log.debug("Executing DynamoDB query: " + queryRequest); return dynamoDB.query(queryRequest); } }, reporter, PrintCounter.DynamoDBReadThrottle); return retryResult; }
private static void findRepliesForAThreadSpecifyOptionalLimit(String forumName, String threadSubject) { Map<String, AttributeValue> lastEvaluatedKey = null; do { QueryRequest queryRequest = new QueryRequest() .withTableName(tableName) .withKeyConditions(makeReplyKeyConditions(forumName, threadSubject)) .withLimit(1) .withExclusiveStartKey(lastEvaluatedKey); QueryResult result = client.query(queryRequest); for (Map<String, AttributeValue> item : result.getItems()) { printItem(item); } lastEvaluatedKey = result.getLastEvaluatedKey(); } while (lastEvaluatedKey != null); }
public static QueryRequest copyQueryRequest(QueryRequest queryRequest) { QueryRequest copiedQueryRequest = new QueryRequest().withAttributesToGet(queryRequest.getAttributesToGet()) .withConsistentRead(queryRequest.getConsistentRead()) .withExclusiveStartKey(queryRequest.getExclusiveStartKey()).withIndexName(queryRequest.getIndexName()) .withKeyConditions(queryRequest.getKeyConditions()).withLimit(queryRequest.getLimit()) .withReturnConsumedCapacity(queryRequest.getReturnConsumedCapacity()) .withScanIndexForward(queryRequest.getScanIndexForward()).withSelect(queryRequest.getSelect()) .withTableName(queryRequest.getTableName()); return copiedQueryRequest; } }