use of com.datastax.oss.driver.api.core.cql.ColumnDefinitions in project java-driver by datastax.
the class Conversions method toResultSet.
public static AsyncResultSet toResultSet(Result result, ExecutionInfo executionInfo, CqlSession session, InternalDriverContext context) {
if (result instanceof Rows) {
Rows rows = (Rows) result;
Statement<?> statement = (Statement<?>) executionInfo.getRequest();
ColumnDefinitions columnDefinitions = getResultDefinitions(rows, statement, context);
return new DefaultAsyncResultSet(columnDefinitions, executionInfo, rows.getData(), session, context);
} else if (result instanceof Prepared) {
// This should never happen
throw new IllegalArgumentException("Unexpected PREPARED response to a CQL query");
} else {
// Void, SetKeyspace, SchemaChange
return DefaultAsyncResultSet.empty(executionInfo);
}
}
use of com.datastax.oss.driver.api.core.cql.ColumnDefinitions in project java-driver by datastax.
the class Conversions method getResultDefinitions.
public static ColumnDefinitions getResultDefinitions(Rows rows, Statement<?> statement, InternalDriverContext context) {
RowsMetadata rowsMetadata = rows.getMetadata();
if (rowsMetadata.columnSpecs.isEmpty()) {
// If the response has no metadata, it means the request had SKIP_METADATA set, the driver
// only ever does that for bound statements.
BoundStatement boundStatement = (BoundStatement) statement;
return boundStatement.getPreparedStatement().getResultSetDefinitions();
} else {
// The response has metadata, always use it above anything else we might have locally.
ColumnDefinitions definitions = toColumnDefinitions(rowsMetadata, context);
// prepared statement's copy of the metadata
if (rowsMetadata.newResultMetadataId != null) {
BoundStatement boundStatement = (BoundStatement) statement;
PreparedStatement preparedStatement = boundStatement.getPreparedStatement();
preparedStatement.setResultMetadata(ByteBuffer.wrap(rowsMetadata.newResultMetadataId).asReadOnlyBuffer(), definitions);
}
return definitions;
}
}
use of com.datastax.oss.driver.api.core.cql.ColumnDefinitions in project java-driver by datastax.
the class DefaultContinuousResultSetTest method mockPage.
private static ContinuousAsyncResultSet mockPage(boolean nextPage, Integer... data) {
ContinuousAsyncResultSet page = Mockito.mock(ContinuousAsyncResultSet.class);
ColumnDefinitions columnDefinitions = Mockito.mock(ColumnDefinitions.class);
Mockito.when(page.getColumnDefinitions()).thenReturn(columnDefinitions);
ExecutionInfo executionInfo = Mockito.mock(ExecutionInfo.class);
Mockito.when(page.getExecutionInfo()).thenReturn(executionInfo);
if (nextPage) {
Mockito.when(page.hasMorePages()).thenReturn(true);
Mockito.when(page.fetchNextPage()).thenReturn(Mockito.spy(new CompletableFuture<>()));
} else {
Mockito.when(page.hasMorePages()).thenReturn(false);
Mockito.when(page.fetchNextPage()).thenThrow(new IllegalStateException());
}
Iterator<Integer> rows = Arrays.asList(data).iterator();
CountingIterator<Row> iterator = new CountingIterator<Row>(data.length) {
@Override
protected Row computeNext() {
return rows.hasNext() ? mockRow(rows.next()) : endOfData();
}
};
Mockito.when(page.currentPage()).thenReturn(() -> iterator);
Mockito.when(page.remaining()).thenAnswer(invocation -> iterator.remaining());
return page;
}
use of com.datastax.oss.driver.api.core.cql.ColumnDefinitions in project java-driver by datastax.
the class CqlRequestReactiveProcessorTest method should_complete_single_page_result.
@Test
@UseDataProvider(value = "allDseAndOssProtocolVersions", location = DseTestDataProviders.class)
public void should_complete_single_page_result(ProtocolVersion version) {
try (RequestHandlerTestHarness harness = RequestHandlerTestHarness.builder().withProtocolVersion(version).withResponse(node1, defaultFrameOf(singleDseRow())).build()) {
DefaultSession session = harness.getSession();
InternalDriverContext context = harness.getContext();
ReactiveResultSet publisher = new CqlRequestReactiveProcessor(new CqlRequestAsyncProcessor()).process(UNDEFINED_IDEMPOTENCE_STATEMENT, session, context, "test");
List<ReactiveRow> rows = Flowable.fromPublisher(publisher).toList().blockingGet();
assertThat(rows).hasSize(1);
ReactiveRow row = rows.get(0);
assertThat(row.getString("message")).isEqualTo("hello, world");
ExecutionInfo executionInfo = row.getExecutionInfo();
assertThat(executionInfo.getCoordinator()).isEqualTo(node1);
assertThat(executionInfo.getErrors()).isEmpty();
assertThat(executionInfo.getIncomingPayload()).isEmpty();
assertThat(executionInfo.getPagingState()).isNull();
assertThat(executionInfo.getSpeculativeExecutionCount()).isEqualTo(0);
assertThat(executionInfo.getSuccessfulExecutionIndex()).isEqualTo(0);
assertThat(executionInfo.getWarnings()).isEmpty();
Flowable<ExecutionInfo> execInfosFlowable = Flowable.fromPublisher(publisher.getExecutionInfos());
assertThat(execInfosFlowable.toList().blockingGet()).containsExactly(executionInfo);
Flowable<ColumnDefinitions> colDefsFlowable = Flowable.fromPublisher(publisher.getColumnDefinitions());
assertThat(colDefsFlowable.toList().blockingGet()).containsExactly(row.getColumnDefinitions());
Flowable<Boolean> wasAppliedFlowable = Flowable.fromPublisher(publisher.wasApplied());
assertThat(wasAppliedFlowable.toList().blockingGet()).containsExactly(row.wasApplied());
}
}
use of com.datastax.oss.driver.api.core.cql.ColumnDefinitions in project java-driver by datastax.
the class CqlRequestReactiveProcessorTest method should_complete_multi_page_result.
@Test
@UseDataProvider(value = "allDseAndOssProtocolVersions", location = DseTestDataProviders.class)
public void should_complete_multi_page_result(ProtocolVersion version) {
RequestHandlerTestHarness.Builder builder = RequestHandlerTestHarness.builder().withProtocolVersion(version);
PoolBehavior node1Behavior = builder.customBehavior(node1);
try (RequestHandlerTestHarness harness = builder.build()) {
DefaultSession session = harness.getSession();
InternalDriverContext context = harness.getContext();
// The 2nd page is obtained by an "external" call to session.executeAsync(),
// so we need to mock that.
CompletableFuture<AsyncResultSet> page2Future = new CompletableFuture<>();
when(session.executeAsync(any(Statement.class))).thenAnswer(invocation -> page2Future);
ExecutionInfo mockInfo = mock(ExecutionInfo.class);
ReactiveResultSet publisher = new CqlRequestReactiveProcessor(new CqlRequestAsyncProcessor()).process(UNDEFINED_IDEMPOTENCE_STATEMENT, session, context, "test");
Flowable<ReactiveRow> rowsPublisher = Flowable.fromPublisher(publisher).cache();
rowsPublisher.subscribe();
// emulate arrival of page 1
node1Behavior.setResponseSuccess(defaultFrameOf(DseTestFixtures.tenDseRows(1, false)));
// emulate arrival of page 2 following the call to session.executeAsync()
page2Future.complete(Conversions.toResultSet(DseTestFixtures.tenDseRows(2, true), mockInfo, harness.getSession(), harness.getContext()));
List<ReactiveRow> rows = rowsPublisher.toList().blockingGet();
assertThat(rows).hasSize(20);
ReactiveRow first = rows.get(0);
ExecutionInfo firstExecutionInfo = first.getExecutionInfo();
assertThat(firstExecutionInfo.getCoordinator()).isEqualTo(node1);
assertThat(firstExecutionInfo.getErrors()).isEmpty();
assertThat(firstExecutionInfo.getIncomingPayload()).isEmpty();
assertThat(firstExecutionInfo.getPagingState()).isNotNull();
assertThat(firstExecutionInfo.getSpeculativeExecutionCount()).isEqualTo(0);
assertThat(firstExecutionInfo.getSuccessfulExecutionIndex()).isEqualTo(0);
assertThat(firstExecutionInfo.getWarnings()).isEmpty();
ReactiveRow inSecondPage = rows.get(10);
ExecutionInfo secondExecutionInfo = inSecondPage.getExecutionInfo();
assertThat(secondExecutionInfo).isSameAs(mockInfo);
Flowable<ExecutionInfo> execInfosFlowable = Flowable.fromPublisher(publisher.getExecutionInfos());
assertThat(execInfosFlowable.toList().blockingGet()).containsExactly(firstExecutionInfo, secondExecutionInfo);
Flowable<ColumnDefinitions> colDefsFlowable = Flowable.fromPublisher(publisher.getColumnDefinitions());
assertThat(colDefsFlowable.toList().blockingGet()).containsExactly(first.getColumnDefinitions());
Flowable<Boolean> wasAppliedFlowable = Flowable.fromPublisher(publisher.wasApplied());
assertThat(wasAppliedFlowable.toList().blockingGet()).containsExactly(first.wasApplied());
}
}
Aggregations