From 9361237bd624eacbcabd5d984afb5bd01f0f806a Mon Sep 17 00:00:00 2001 From: Yegor Bugayenko Date: Fri, 18 Nov 2016 17:27:31 +0200 Subject: [PATCH] #84 COUNT for Scan --- src/main/java/com/jcabi/dynamo/AwsTable.java | 2 +- src/main/java/com/jcabi/dynamo/ScanValve.java | 34 +++++++++++++------ 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/jcabi/dynamo/AwsTable.java b/src/main/java/com/jcabi/dynamo/AwsTable.java index f545a0f..314b8a7 100644 --- a/src/main/java/com/jcabi/dynamo/AwsTable.java +++ b/src/main/java/com/jcabi/dynamo/AwsTable.java @@ -194,7 +194,7 @@ public static String print( final ConsumedCapacity capacity) { final String txt; if (capacity == null) { - txt = ""; + txt = "no units"; } else { txt = String.format("%.2f units", capacity.getCapacityUnits()); } diff --git a/src/main/java/com/jcabi/dynamo/ScanValve.java b/src/main/java/com/jcabi/dynamo/ScanValve.java index 3ed982e..02e2f8b 100644 --- a/src/main/java/com/jcabi/dynamo/ScanValve.java +++ b/src/main/java/com/jcabi/dynamo/ScanValve.java @@ -36,6 +36,7 @@ import com.amazonaws.services.dynamodbv2.model.ReturnConsumedCapacity; import com.amazonaws.services.dynamodbv2.model.ScanRequest; import com.amazonaws.services.dynamodbv2.model.ScanResult; +import com.amazonaws.services.dynamodbv2.model.Select; import com.google.common.collect.Iterables; import com.jcabi.aspects.Immutable; import com.jcabi.aspects.Loggable; @@ -136,18 +137,29 @@ public Dosage fetch(final Credentials credentials, @Override public int count(final Credentials credentials, final String table, final Map conditions) throws IOException { - Dosage dosage = this.fetch( - credentials, table, conditions, Collections.emptyList() - ); - int count = 0; - while (true) { - count += dosage.items().size(); - if (!dosage.hasNext()) { - break; - } - dosage = dosage.next(); + final AmazonDynamoDB aws = credentials.aws(); + try { + final ScanRequest request = new ScanRequest() + .withTableName(table) + .withReturnConsumedCapacity(ReturnConsumedCapacity.TOTAL) + .withScanFilter(conditions) + .withSelect(Select.COUNT) + .withLimit(Integer.MAX_VALUE); + final long start = System.currentTimeMillis(); + final ScanResult rslt = aws.scan(request); + final int count = rslt.getCount(); + Logger.info( + this, + // @checkstyle LineLength (1 line) + "#total(): COUNT=%d in '%s' using %s, %s, in %[ms]s", + count, request.getTableName(), request.getFilterExpression(), + AwsTable.print(rslt.getConsumedCapacity()), + System.currentTimeMillis() - start + ); + return count; + } finally { + aws.shutdown(); } - return count; } /**