private Status readUsingQuery( String table, String key, Set<String> fields, Map<String, ByteIterator> result) { Statement query; Iterable<String> columns = fields == null ? STANDARD_FIELDS : fields; if (fields == null || fields.size() == fieldCount) { query = Statement.newBuilder(standardQuery).bind("key").to(key).build(); } else { Joiner joiner = Joiner.on(','); query = Statement.newBuilder("SELECT ") .append(joiner.join(fields)) .append(" FROM ") .append(table) .append(" WHERE id=@key") .bind("key").to(key) .build(); } try (ResultSet resultSet = dbClient.singleUse(timestampBound).executeQuery(query)) { resultSet.next(); decodeStruct(columns, resultSet, result); if (resultSet.next()) { throw new Exception("Expected exactly one row for each read."); } return Status.OK; } catch (Exception e) { LOGGER.log(Level.INFO, "readUsingQuery()", e); return Status.ERROR; } }
private Status scanUsingQuery( String table, String startKey, int recordCount, Set<String> fields, Vector<HashMap<String, ByteIterator>> result) { Iterable<String> columns = fields == null ? STANDARD_FIELDS : fields; Statement query; if (fields == null || fields.size() == fieldCount) { query = Statement.newBuilder(standardScan).bind("startKey").to(startKey).bind("count").to(recordCount).build(); } else { Joiner joiner = Joiner.on(','); query = Statement.newBuilder("SELECT ") .append(joiner.join(fields)) .append(" FROM ") .append(table) .append(" WHERE id>=@startKey LIMIT @count") .bind("startKey").to(startKey) .bind("count").to(recordCount) .build(); } try (ResultSet resultSet = dbClient.singleUse(timestampBound).executeQuery(query)) { while (resultSet.next()) { HashMap<String, ByteIterator> row = new HashMap<>(); decodeStruct(columns, resultSet, row); result.add(row); } return Status.OK; } catch (Exception e) { LOGGER.log(Level.INFO, "scanUsingQuery()", e); return Status.ERROR; } }
@Test public void append() { Statement stmt = Statement.newBuilder("SELECT Name FROM Users") .append(" WHERE Id = @id") .bind("id") .to(1234) .append(" AND Status = @status") .bind("status") .to("ACTIVE") .build(); String expectedSql = "SELECT Name FROM Users WHERE Id = @id AND Status = @status"; assertThat(stmt.getSql()).isEqualTo(expectedSql); assertThat(stmt.hasBinding("id")).isTrue(); assertThat(stmt.hasBinding("status")).isTrue(); assertThat(stmt.getParameters()) .containsExactlyEntriesIn( ImmutableMap.of("id", Value.int64(1234), "status", Value.string("ACTIVE"))); assertThat(stmt.toString()).startsWith(expectedSql); assertThat(stmt.toString()).contains("id: 1234"); assertThat(stmt.toString()).contains("status: ACTIVE"); }
@Test public void serialization() throws Exception { Statement stmt = Statement.newBuilder("SELECT * FROM table WHERE ") .append("bool_field = @bool_field ") .bind("bool_field") .to(true) .append("long_field = @long_field ") .bind("long_field") .to(1L) .append("float_field = @float_field ") .bind("float_field") .to(1.) .append("string_field = @string_field ") .bind("string_field") .to("abc") .append("bytes_field = @bytes_field ") .bind("bytes_field") .to(ByteArray.fromBase64("abcd")) .build(); reserializeAndAssert(stmt); }
@Test public void equalsAndHashCode() { EqualsTester tester = new EqualsTester(); tester.addEqualityGroup( Statement.of("SELECT 1"), Statement.of("SELECT 1"), Statement.newBuilder("SELECT ").append("1").build()); tester.addEqualityGroup(Statement.of("SELECT 2")); // Note that some of the following are incomplete bindings: they would fail if executed. tester.addEqualityGroup( Statement.newBuilder("SELECT @x, @y").bind("x").to(1).build(), Statement.newBuilder("SELECT @x, @y").bind("x").to(1).build()); tester.addEqualityGroup(Statement.newBuilder("SELECT @x, @y").bind("x").to("1").build()); tester.addEqualityGroup(Statement.newBuilder("SELECT @x, @y").bind("x").to(2).build()); tester.addEqualityGroup(Statement.newBuilder("SELECT @x, @y").bind("y").to(2).build()); tester.addEqualityGroup( Statement.newBuilder("SELECT @x, @y").bind("x").to(1).bind("y").to(2).build()); tester.testEquals(); } }
@Test public void gettersAreSnapshot() { Statement stmt = Statement.newBuilder("SELECT Name FROM Users WHERE Id = @id") .append(" AND Status = @status") .bind("status") .to("ACTIVE") .bind("id") .to(1234) .bind("status") .to("ACTIVE") .build(); assertThat(stmt.getSql()) .isEqualTo("SELECT Name FROM Users WHERE Id = @id AND Status = @status"); assertThat(stmt.getParameters()) .isEqualTo(ImmutableMap.of("id", Value.int64(1234), "status", Value.string("ACTIVE"))); }