/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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 org.apache.accumulo.core.client;

import org.apache.accumulo.core.data.Range;

/**
 * Scans a table over a given range.
 *
 * "Clients can iterate over multiple column families, and there are several mechanisms for limiting
 * the rows, columns, and timestamps traversed by a scan. For example, we could restrict [a] scan
 * ... to only produce anchors whose columns match [a] regular expression ..., or to only produce
 * anchors whose timestamps fall within ten days of the current time."
 */
public interface Scanner extends ScannerBase {

  /**
   * This setting determines how long a scanner will automatically retry when a failure occurs. By
   * default a scanner will retry forever.
   *
   * @param timeOut
   *          in seconds
   * @deprecated Since 1.5. See {@link ScannerBase#setTimeout(long, java.util.concurrent.TimeUnit)}
   */
  @Deprecated
  void setTimeOut(int timeOut);

  /**
   * Returns the setting for how long a scanner will automatically retry when a failure occurs.
   *
   * @return the timeout configured for this scanner
   * @deprecated Since 1.5. See {@link ScannerBase#getTimeout(java.util.concurrent.TimeUnit)}
   */
  @Deprecated
  int getTimeOut();

  /**
   * Sets the range of keys to scan over.
   *
   * @param range
   *          key range to begin and end scan
   */
  void setRange(Range range);

  /**
   * Returns the range of keys to scan over.
   *
   * @return the range configured for this scanner
   */
  Range getRange();

  /**
   * Sets the number of Key/Value pairs that will be fetched at a time from a tablet server.
   *
   * @param size
   *          the number of Key/Value pairs to fetch per call to Accumulo
   */
  void setBatchSize(int size);

  /**
   * Returns the batch size (number of Key/Value pairs) that will be fetched at a time from a tablet
   * server.
   *
   * @return the batch size configured for this scanner
   */
  int getBatchSize();

  /**
   * Enables row isolation. Writes that occur to a row after a scan of that row has begun will not
   * be seen if this option is enabled.
   */
  void enableIsolation();

  /**
   * Disables row isolation. Writes that occur to a row after a scan of that row has begun may be
   * seen if this option is enabled.
   */
  void disableIsolation();

  /**
   * The number of batches of Key/Value pairs returned before the {@link Scanner} will begin to
   * prefetch the next batch
   *
   * @return Number of batches before read-ahead begins
   * @since 1.6.0
   */
  long getReadaheadThreshold();

  /**
   * Sets the number of batches of Key/Value pairs returned before the {@link Scanner} will begin to
   * prefetch the next batch
   *
   * @param batches
   *          Non-negative number of batches
   * @since 1.6.0
   */
  void setReadaheadThreshold(long batches);
}
