/*
 * Copyright DataStax, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.datastax.oss.driver.api.core;

import com.datastax.oss.driver.api.core.cql.ColumnDefinitions;
import com.datastax.oss.driver.api.core.cql.ExecutionInfo;
import com.datastax.oss.driver.internal.core.AsyncPagingIterableWrapper;
import edu.umd.cs.findbugs.annotations.NonNull;
import edu.umd.cs.findbugs.annotations.Nullable;
import java.util.Iterator;
import java.util.concurrent.CompletionStage;
import java.util.function.Function;

An iterable of elements which are fetched asynchronously by the driver, possibly in multiple requests.
/** * An iterable of elements which are fetched asynchronously by the driver, possibly in multiple * requests. */
public interface AsyncPagingIterable<ElementT, SelfT extends AsyncPagingIterable<ElementT, SelfT>> {
Metadata about the columns returned by the CQL request that was used to build this result.
/** Metadata about the columns returned by the CQL request that was used to build this result. */
@NonNull ColumnDefinitions getColumnDefinitions();
Returns information about the execution of this page of results.
/** Returns {@linkplain ExecutionInfo information about the execution} of this page of results. */
@NonNull ExecutionInfo getExecutionInfo();
How many rows are left before the current page is exhausted.
/** How many rows are left before the current page is exhausted. */
int remaining();
The elements in the current page. To keep iterating beyond that, use hasMorePages() and fetchNextPage().

Note that this method always returns the same object, and that that object can only be iterated once: elements are "consumed" as they are read.

/** * The elements in the current page. To keep iterating beyond that, use {@link #hasMorePages()} * and {@link #fetchNextPage()}. * * <p>Note that this method always returns the same object, and that that object can only be * iterated once: elements are "consumed" as they are read. */
@NonNull Iterable<ElementT> currentPage();
Returns the next element, or null if the results are exhausted.

This is convenient for queries that are known to return exactly one element, for example count queries.

/** * Returns the next element, or {@code null} if the results are exhausted. * * <p>This is convenient for queries that are known to return exactly one element, for example * count queries. */
@Nullable default ElementT one() { Iterator<ElementT> iterator = currentPage().iterator(); return iterator.hasNext() ? iterator.next() : null; }
Whether there are more pages of results. If so, call fetchNextPage() to fetch the next one asynchronously.
/** * Whether there are more pages of results. If so, call {@link #fetchNextPage()} to fetch the next * one asynchronously. */
boolean hasMorePages();
Fetch the next page of results asynchronously.
Throws:
  • IllegalStateException – if there are no more pages. Use hasMorePages() to check if you can call this method.
/** * Fetch the next page of results asynchronously. * * @throws IllegalStateException if there are no more pages. Use {@link #hasMorePages()} to check * if you can call this method. */
@NonNull CompletionStage<SelfT> fetchNextPage() throws IllegalStateException;
If the query that produced this result was a CQL conditional update, indicate whether it was successfully applied.

For consistency, this method always returns true for non-conditional queries (although there is no reason to call the method in that case). This is also the case for conditional DDL statements (CREATE KEYSPACE... IF NOT EXISTS, CREATE TABLE... IF NOT EXISTS), for which Cassandra doesn't return an [applied] column.

Note that, for versions of Cassandra strictly lower than 2.1.0-rc2, a server-side bug (CASSANDRA-7337) causes this method to always return true for batches containing conditional queries.

/** * If the query that produced this result was a CQL conditional update, indicate whether it was * successfully applied. * * <p>For consistency, this method always returns {@code true} for non-conditional queries * (although there is no reason to call the method in that case). This is also the case for * conditional DDL statements ({@code CREATE KEYSPACE... IF NOT EXISTS}, {@code CREATE TABLE... IF * NOT EXISTS}), for which Cassandra doesn't return an {@code [applied]} column. * * <p>Note that, for versions of Cassandra strictly lower than 2.1.0-rc2, a server-side bug (<a * href="https://issues.apache.org/jira/browse/CASSANDRA-7337">CASSANDRA-7337</a>) causes this * method to always return {@code true} for batches containing conditional queries. */
boolean wasApplied();
Creates a new instance by transforming each element of this iterable with the provided function.

Note that both instances share the same underlying data: consuming elements from the transformed iterable will also consume them from this object, and vice-versa.

/** * Creates a new instance by transforming each element of this iterable with the provided * function. * * <p>Note that both instances share the same underlying data: consuming elements from the * transformed iterable will also consume them from this object, and vice-versa. */
default <TargetT> MappedAsyncPagingIterable<TargetT> map( Function<? super ElementT, ? extends TargetT> elementMapper) { return new AsyncPagingIterableWrapper<>(this, elementMapper); } }