@Test
  public void queryWithUnknownHashRangeKey2() {
    putItemWithHashKeyAndRangeKey();

    String hashCode = "hash2";

    Condition rangeKeyCondition = new Condition();
    List<AttributeValue> attributeValueList = new ArrayList<AttributeValue>();
    attributeValueList.add(new AttributeValue().withS("range2x"));
    attributeValueList.add(new AttributeValue().withS("range2y"));
    rangeKeyCondition.setAttributeValueList(attributeValueList);
    rangeKeyCondition.setComparisonOperator(ComparisonOperator.BETWEEN);

    TestClassWithHashRangeKey hashKeyTemplate = new TestClassWithHashRangeKey();
    hashKeyTemplate.setHashCode(hashCode);

    DynamoDBQueryExpression<TestClassWithHashRangeKey> query =
        new DynamoDBQueryExpression<TestClassWithHashRangeKey>()
            .withHashKeyValues(hashKeyTemplate)
            .withRangeKeyCondition("rangeCode", rangeKeyCondition);

    List<TestClassWithHashRangeKey> valueList =
        mapper.query(TestClassWithHashRangeKey.class, query);
    Assert.assertNotNull("Value list is null.", valueList);
    Assert.assertEquals("Value list should be empty.", 0, valueList.size());
  }
  @Test
  public void queryWithHashRangeKey() {
    putItemWithHashKeyAndRangeKey();

    TestClassWithHashRangeKey value2c = new TestClassWithHashRangeKey();
    value2c.setHashCode("hash2");
    value2c.setRangeCode("range2c");
    value2c.setStringData("string2c");
    value2c.setIntData(23);
    value2c.setStringSetData(set("stringSetVal2c1", "stringSetVal2c2"));
    value2c.setNumberSetData(set(7, 8));
    mapper.save(value2c);

    TestClassWithHashRangeKey value2d = new TestClassWithHashRangeKey();
    value2d.setHashCode("hash2");
    value2d.setRangeCode("range2d");
    value2d.setStringData("string2d");
    value2d.setIntData(24);
    value2d.setStringSetData(set("stringSetVal2d1", "stringSetVal2d2"));
    value2d.setNumberSetData(set(9, 10));
    mapper.save(value2d);

    TestClassWithHashRangeKey value2e = new TestClassWithHashRangeKey();
    value2e.setHashCode("hash2");
    value2e.setRangeCode("range2e");
    value2e.setStringData("string2e");
    value2e.setIntData(25);
    value2e.setStringSetData(set("stringSetVal2e1", "stringSetVal2e2"));
    value2e.setNumberSetData(set(11, 12));
    mapper.save(value2e);

    String hashCode = "hash2";
    TestClassWithHashRangeKey hashKeyTemplate = new TestClassWithHashRangeKey();
    hashKeyTemplate.setHashCode(hashCode);

    Condition rangeKeyCondition = new Condition();
    List<AttributeValue> rangeValues = new ArrayList<AttributeValue>();
    rangeValues.add(new AttributeValue().withS("range2c"));
    rangeValues.add(new AttributeValue().withS("range2d"));
    rangeKeyCondition.setComparisonOperator(ComparisonOperator.BETWEEN);
    rangeKeyCondition.setAttributeValueList(rangeValues);

    DynamoDBQueryExpression<TestClassWithHashRangeKey> query =
        new DynamoDBQueryExpression<TestClassWithHashRangeKey>()
            .withHashKeyValues(hashKeyTemplate)
            .withRangeKeyCondition("rangeCode", rangeKeyCondition);

    List<TestClassWithHashRangeKey> valueList =
        mapper.query(TestClassWithHashRangeKey.class, query);
    Assert.assertNotNull("Value list is null.", valueList);
    Assert.assertNotSame("Value list is empty.", 0, valueList.size());

    Assert.assertEquals("Value list should have 2 items.", 2, valueList.size());

    TestClassWithHashRangeKey value = valueList.get(0);
    Assert.assertEquals("Wrong hashCode.", hashCode, value.getHashCode());
    Assert.assertEquals("Wrong rangeCode.", "range2c", value.getRangeCode());
    Assert.assertEquals("Wrong stringData.", "string2c", value.getStringData());
    Assert.assertEquals("Wrong intData.", 23, value.getIntData());
    Assert.assertEquals(
        "Wrong stringSetData.",
        set("stringSetVal2c1", "stringSetVal2c2"),
        value.getStringSetData());
    Assert.assertEquals("Wrong numberSetData.", set(7, 8), value.getNumberSetData());

    value = valueList.get(1);
    Assert.assertEquals("Wrong hashCode.", hashCode, value.getHashCode());
    Assert.assertEquals("Wrong rangeCode.", "range2d", value.getRangeCode());
    Assert.assertEquals("Wrong stringData.", "string2d", value.getStringData());
    Assert.assertEquals("Wrong intData.", 24, value.getIntData());
    Assert.assertEquals(
        "Wrong stringSetData.",
        set("stringSetVal2d1", "stringSetVal2d2"),
        value.getStringSetData());
    Assert.assertEquals("Wrong numberSetData.", set(9, 10), value.getNumberSetData());
  }
  /** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */
  protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    String category = request.getParameter("category");
    HashMap<String, Condition> scanFilter = new HashMap<String, Condition>();
    Condition condition =
        new Condition()
            .withComparisonOperator(ComparisonOperator.NE.toString())
            .withAttributeValueList(new AttributeValue().withN("0"));
    Condition condition2 =
        new Condition()
            .withComparisonOperator(ComparisonOperator.NE.toString())
            .withAttributeValueList(new AttributeValue().withN("0"));
    Condition condition3 = new Condition().withComparisonOperator(ComparisonOperator.CONTAINS);

    scanFilter.put("geoLat", condition);
    scanFilter.put("geoLng", condition2);
    if (category != null && !category.isEmpty()) {
      condition3.withAttributeValueList(new AttributeValue().withS(category));
      scanFilter.put("category", condition3);
    }

    // String queueUrl = SQS.getQueueUrl(new GetQueueUrlRequest(SQS_QUEUE_NAME)).getQueueUrl();

    String tableName = DYNAMODB_TABLE_NAME;
    ScanRequest scanRequest = new ScanRequest(tableName).withScanFilter(scanFilter);
    ScanResult scanResult = DYNAMODB.scan(scanRequest);

    int size = scanResult.getItems().size();
    ArrayList<HashMap<String, String>> tweets = new ArrayList<HashMap<String, String>>();

    for (int i = 0; i < size; i++) {
      // Get latitude, longitude, content, username, created (long), category, sentiment
      String categorydb = "no category";
      String sentiment = "no sentiment";
      if (scanResult.getItems().get(i).get("category") != null) {
        categorydb = scanResult.getItems().get(i).get("category").getS();
        sentiment = scanResult.getItems().get(i).get("sentiment").getS();
        String lat = scanResult.getItems().get(i).get("geoLat").getN();
        String lng = scanResult.getItems().get(i).get("geoLng").getN();
        String content = scanResult.getItems().get(i).get("content").getS();
        String username = scanResult.getItems().get(i).get("username").getS();
        String created = scanResult.getItems().get(i).get("createdLong").getN();
        String createdDate = scanResult.getItems().get(i).get("createdDate").getS();

        // Format date.
        DateFormat fromFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
        DateFormat toFormat = new SimpleDateFormat("MMM dd · k:mm z");
        Date date;
        String createdstr;
        try {
          date = fromFormat.parse(createdDate);
          createdstr = toFormat.format(date);
        } catch (ParseException e) {
          createdstr = createdDate;
        }

        // Create tweet hash.
        HashMap<String, String> tweet = new HashMap<String, String>();
        tweet.put("lat", lat);
        tweet.put("lng", lng);
        tweet.put("content", content);
        tweet.put("username", username);
        tweet.put("category", categorydb);
        tweet.put("sentiment", sentiment);
        tweet.put("created", created);
        tweet.put("createdstr", createdstr);

        // Order tweet by time created. Most recent at the top of the list.
        int position = 0;
        while (position < tweets.size()
            && Long.parseLong(tweets.get(position).get("created")) > Long.parseLong(created)) {
          position++;
        }
        tweets.add(position, tweet);
      }
      // else {
      // Send tweet with blank category for sentimental processing
      //    String id = scanResult.getItems().get(i).get("id").getS();
      //    SQS.sendMessage(new SendMessageRequest(queueUrl, id));
      // }

    }

    // Log result.
    System.out.println("Successfully handled GET request.");
    if (category != null) {
      System.out.println("category:" + category);
    }
    System.out.println("size: " + tweets.size());

    // Convert object to JSON format.
    String json = new Gson().toJson(tweets);
    response.setContentType("application/json");
    response.setCharacterEncoding("UTF-8");
    response.getWriter().write(json);
  }