private void checkRange(Source source, KeySet keySet, int... expectedRows) { checkReadRange(source, keySet, 0, expectedRows); }
@Test public void standardDMLWithExecuteSQL() { executeQuery(DML_COUNT, INSERT_DML); // checks for multi-stmts within a txn, therefore also verifying seqNo. executeQuery(DML_COUNT * 2, UPDATE_DML, DELETE_DML); } }
private void setUpPrivateDatabase() { ImmutableList.Builder<History> historyBuilder = ImmutableList.builder(); client = newTestDatabase(historyBuilder); history = historyBuilder.build(); }
private void checkRange(Source source, KeyRange range, int... expectedRows) { checkRange(source, KeySet.range(range), expectedRows); }
@Test public void basicsUsingRead() throws InterruptedException { doBasicsTest( new ReadStrategy() { @Override public Struct read(ReadContext ctx, String key) { return ctx.readRow("T", Key.of(key), Arrays.asList("V")); } }); }
private Struct execute(Statement.Builder builder, Type expectedColumnType) { return execute(builder.build(), expectedColumnType); } }
@Test public void limitRead() { checkRangeWithLimit( Source.BASE_TABLE, 2, KeyRange.closedClosed(Key.of("k3"), Key.of("k7")), 3, 4); checkRangeWithLimit( Source.BASE_TABLE, 0, KeyRange.closedClosed(Key.of("k3"), Key.of("k7")), 3, 4, 5, 6, 7); }
@Test public void read() { try (ResultSet resultSet = client .singleUse() .read(TABLE_NAME, KeySet.all(), Arrays.asList("Key", "Data", "Fingerprint", "Size"))) { validate(resultSet); } }
private Struct execute(Statement statement, Type expectedColumnType) { Type rowType = Type.struct(StructField.of("", expectedColumnType)); return executeWithRowResultType(statement, rowType); }
@Test public void abortOnceShouldSucceedAfterRetry() { try { throwAbortOnce = true; executeUpdate(DML_COUNT, INSERT_DML); assertThat(throwAbortOnce).isFalse(); } catch (AbortedException e) { fail("Abort Exception not caught and retried"); } }
private Mutation.WriteBuilder baseInsert() { return Mutation.newInsertOrUpdateBuilder("T").set("K").to(lastKey = uniqueString()); }
private static DatabaseClient newTestDatabase(ImmutableList.Builder<History> historyBuilder) { Database newDb = env.getTestHelper() .createTestDatabase( "CREATE TABLE TestTable ( StringValue STRING(MAX) ) PRIMARY KEY ()"); DatabaseClient newClient = env.getTestHelper().getDatabaseClient(newDb); for (int i = 0; i < 5; ++i) { writeNewValue(newClient, i, historyBuilder); } return newClient; }
@Test public void multiPointRead() { KeySet keys = KeySet.newBuilder().addKey(Key.of("k3")).addKey(Key.of("k5")).addKey(Key.of("k7")).build(); checkRange(Source.BASE_TABLE, keys, 3, 5, 7); }
private void checkRangeWithLimit(Source source, long limit, KeyRange range, int... expectedRows) { checkReadRange(source, KeySet.range(range), limit, expectedRows); } }
@Test public void basicsUsingQuery() throws InterruptedException { doBasicsTest( new ReadStrategy() { @Override public Struct read(ReadContext ctx, String key) { ResultSet resultSet = ctx.executeQuery( Statement.newBuilder("SELECT V FROM T WHERE K = @key") .bind("key") .to(key) .build()); assertThat(resultSet.next()).isTrue(); Struct row = resultSet.getCurrentRowAsStruct(); assertThat(resultSet.next()).isFalse(); return row; } }); }
@Test public void badQuery() { expectedException.expect(isSpannerException(ErrorCode.INVALID_ARGUMENT)); expectedException.expectMessage("Unrecognized name: Apples"); execute(Statement.of("SELECT Apples AND Oranges"), Type.int64()); }
@BeforeClass public static void setUpSharedDatabase() { ImmutableList.Builder<History> historyBuilder = ImmutableList.builder(); sharedClient = newTestDatabase(historyBuilder); sharedHistory = historyBuilder.build(); }
@Test public void limitReadUsingIndex() { checkRangeWithLimit(Source.INDEX, 2, KeyRange.closedClosed(Key.of("v3"), Key.of("v7")), 3, 4); checkRangeWithLimit( Source.DESC_INDEX, 2, KeyRange.closedClosed(Key.of("v7"), Key.of("v3")), 7, 6); }
@Test public void query() { try (ResultSet resultSet = client .singleUse() .executeQuery( Statement.of( "SELECT Key, Data, Fingerprint, Size FROM " + TABLE_NAME + " ORDER BY Key"))) { validate(resultSet); } }
@Test public void indexMultiPointRead() { KeySet keys = KeySet.newBuilder().addKey(Key.of("v3")).addKey(Key.of("v5")).addKey(Key.of("v7")).build(); checkRange(Source.INDEX, keys, 3, 5, 7); }