/*
* Copyright 2014 NAVER Corp.
*
* 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.navercorp.pinpoint.common.hbase;
import com.sematext.hbase.wd.AbstractRowKeyDistributor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Delete;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.Increment;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.Scan;
import java.util.List;
/**
* @author emeroad
* @author minwoo.jung
*/
public interface HbaseOperations2 {
/**
* Gets an individual row from the given table. The content is mapped by the given action.
*
* @param tableName target table
* @param rowName row name
* @param mapper row mapper
* @return object mapping the target row
*/
<T> T get(TableName tableName, byte[] rowName, final RowMapper<T> mapper);
/**
* Gets an individual row from the given table. The content is mapped by the given action.
*
* @param tableName target table
* @param rowName row name
* @param familyName column family
* @param mapper row mapper
* @return object mapping the target row
*/
<T> T get(TableName tableName, byte[] rowName, byte[] familyName, final RowMapper<T> mapper);
/**
* Gets an individual row from the given table. The content is mapped by the given action.
*
* @param tableName target table
* @param rowName row name
* @param familyName family
* @param qualifier column qualifier
* @param mapper row mapper
* @return object mapping the target row
*/
<T> T get(TableName tableName, final byte[] rowName, final byte[] familyName, final byte[] qualifier, final RowMapper<T> mapper);
<T> T get(TableName tableName, final Get get, final RowMapper<T> mapper);
<T> List<T> get(TableName tableName, final List<Get> get, final RowMapper<T> mapper);
void put(TableName tableName, final byte[] rowName, final byte[] familyName, final byte[] qualifier, final byte[] value);
void put(TableName tableName, final byte[] rowName, final byte[] familyName, final byte[] qualifier, final Long timestamp, final byte[] value);
<T> void put(TableName tableName, final byte[] rowName, final byte[] familyName, final byte[] qualifier, final T value, final ValueMapper<T> mapper);
<T> void put(TableName tableName, final byte[] rowName, final byte[] familyName, final byte[] qualifier, final Long timestamp, final T value, final ValueMapper<T> mapper);
void put(TableName tableName, final Put put);
void put(TableName tableName, final List<Put> puts);
/**
* If asyncOperation is not set, then execute put method instead of asyncPut method.
*/
boolean asyncPut(TableName tableName, final byte[] rowName, final byte[] familyName, final byte[] qualifier, final byte[] value);
/**
* If asyncOperation is not set, then execute put method instead of asyncPut method.
*/
boolean asyncPut(TableName tableName, final byte[] rowName, final byte[] familyName, final byte[] qualifier, final Long timestamp, final byte[] value);
/**
* If asyncOperation is not set, then execute put method instead of asyncPut method.
*/
<T> boolean asyncPut(TableName tableName, final byte[] rowName, final byte[] familyName, final byte[] qualifier, final T value, final ValueMapper<T> mapper);
/**
* If asyncOperation is not set, then execute put method instead of asyncPut method.
*/
<T> boolean asyncPut(TableName tableName, final byte[] rowName, final byte[] familyName, final byte[] qualifier, final Long timestamp, final T value, final ValueMapper<T> mapper);
/**
* If asyncOperation is not set, then execute put method instead of asyncPut method.
*/
boolean asyncPut(TableName tableName, final Put put);
/**
* If asyncOperation is not set, then execute put method instead of asyncPut method.
* @param tableName
* @param puts
* @return the list of puts which could not be queued or put serially. May be null if all put operations were successfully queued.
*/
List<Put> asyncPut(TableName tableName, final List<Put> puts);
void delete(TableName tableName, final Delete delete);
void delete(TableName tableName, final List<Delete> deletes);
<T> List<T> find(TableName tableName, final List<Scan> scans, final ResultsExtractor<T> action);
<T> List<List<T>> find(TableName tableName, final List<Scan> scans, final RowMapper<T> action);
<T> List<T> findParallel(TableName tableName, final List<Scan> scans, final ResultsExtractor<T> action);
<T> List<List<T>> findParallel(TableName tableName, final List<Scan> scans, final RowMapper<T> action);
// Distributed scanners
<T> List<T> find(TableName tableName, final Scan scan, final AbstractRowKeyDistributor rowKeyDistributor, final RowMapper<T> action);
<T> List<T> find(TableName tableName, final Scan scan, final AbstractRowKeyDistributor rowKeyDistributor, int limit, final RowMapper<T> action);
<T> List<T> find(TableName tableName, final Scan scan, final AbstractRowKeyDistributor rowKeyDistributor, int limit, final RowMapper<T> action, final LimitEventHandler limitEventHandler);
<T> T find(TableName tableName, final Scan scan, final AbstractRowKeyDistributor rowKeyDistributor, final ResultsExtractor<T> action);
// Parallel scanners for distributed scans
<T> List<T> findParallel(TableName tableName, final Scan scan, final AbstractRowKeyDistributor rowKeyDistributor, final RowMapper<T> action, int numParallelThreads);
<T> List<T> findParallel(TableName tableName, final Scan scan, final AbstractRowKeyDistributor rowKeyDistributor, int limit, final RowMapper<T> action, int numParallelThreads);
<T> List<T> findParallel(TableName tableName, final Scan scan, final AbstractRowKeyDistributor rowKeyDistributor, int limit, final RowMapper<T> action, final LimitEventHandler limitEventHandler, int numParallelThreads);
<T> T findParallel(TableName tableName, final Scan scan, final AbstractRowKeyDistributor rowKeyDistributor, final ResultsExtractor<T> action, int numParallelThreads);
Result increment(TableName tableName, final Increment increment);
/**
* Exception throwing can partially happen in case of incrementList. you will be accepted the last Exception.
* If you want to retry something with catching a specific exception,
* There is a limitation that you can't know which exception throws due to throwing always last exception.
*
* @param tableName
* @param incrementList
* @return
*/
List<Result> increment(TableName tableName, final List<Increment> incrementList);
long incrementColumnValue(TableName tableName, final byte[] rowName, final byte[] familyName, final byte[] qualifier, final long amount);
long incrementColumnValue(TableName tableName, final byte[] rowName, final byte[] familyName, final byte[] qualifier, final long amount, final boolean writeToWAL);
/**
* Executes the given action against the specified table handling resource management.
* <p>
* Application exceptions thrown by the action object get propagated to the caller (can only be unchecked).
* Allows for returning a result object (typically a domain object or collection of domain objects).
*
* @param tableName the target table
* @param action callback object that specifies the action
* @param <T> action type
* @return the result object of the callback action, or null
*/
<T> T execute(TableName tableName, TableCallback<T> action);
/**
* Scans the target table, using the given family. The content is processed by the given action typically
* returning a domain object or collection of domain objects.
*
* @param tableName target table
* @param family column family
* @param action action handling the scanner results
* @param <T> action type
* @return the result object of the callback action, or null
*/
<T> T find(TableName tableName, String family, final ResultsExtractor<T> action);
/**
* Scans the target table, using the given column family and qualifier.
* The content is processed by the given action typically returning a domain object or collection of domain objects.
*
* @param tableName target table
* @param family column family
* @param qualifier column qualifier
* @param action action handling the scanner results
* @param <T> action type
* @return the result object of the callback action, or null
*/
<T> T find(TableName tableName, String family, String qualifier, final ResultsExtractor<T> action);
/**
* Scans the target table using the given {@link Scan} object. Suitable for maximum control over the scanning
* process.
* The content is processed by the given action typically returning a domain object or collection of domain objects.
*
* @param tableName target table
* @param scan table scanner
* @param action action handling the scanner results
* @param <T> action type
* @return the result object of the callback action, or null
*/
<T> T find(TableName tableName, final Scan scan, final ResultsExtractor<T> action);
/**
* Scans the target table, using the given column family.
* The content is processed row by row by the given action, returning a list of domain objects.
*
* @param tableName target table
* @param family column family
* @param action row mapper handling the scanner results
* @param <T> action type
* @return a list of objects mapping the scanned rows
*/
<T> List<T> find(TableName tableName, String family, final RowMapper<T> action);
/**
* Scans the target table, using the given column family.
* The content is processed row by row by the given action, returning a list of domain objects.
*
* @param tableName target table
* @param family column family
* @param qualifier column qualifier
* @param action row mapper handling the scanner results
* @param <T> action type
* @return a list of objects mapping the scanned rows
*/
<T> List<T> find(TableName tableName, String family, String qualifier, final RowMapper<T> action);
/**
* Scans the target table using the given {@link Scan} object. Suitable for maximum control over the scanning
* process.
* The content is processed row by row by the given action, returning a list of domain objects.
*
* @param tableName target table
* @param scan table scanner
* @param action row mapper handling the scanner results
* @param <T> action type
* @return a list of objects mapping the scanned rows
*/
<T> List<T> find(TableName tableName, final Scan scan, final RowMapper<T> action);
/**
* Gets an individual row from the given table. The content is mapped by the given action.
*
* @param tableName target table
* @param rowName row name
* @param mapper row mapper
* @param <T> mapper type
* @return object mapping the target row
*/
<T> T get(TableName tableName, String rowName, final RowMapper<T> mapper);
/**
* Gets an individual row from the given table. The content is mapped by the given action.
*
* @param tableName target table
* @param rowName row name
* @param familyName column family
* @param mapper row mapper
* @param <T> mapper type
* @return object mapping the target row
*/
<T> T get(TableName tableName, String rowName, String familyName, final RowMapper<T> mapper);
/**
* Gets an individual row from the given table. The content is mapped by the given action.
*
* @param tableName target table
* @param rowName row name
* @param familyName family
* @param qualifier column qualifier
* @param mapper row mapper
* @param <T> mapper type
* @return object mapping the target row
*/
<T> T get(TableName tableName, final String rowName, final String familyName, final String qualifier, final RowMapper<T> mapper);
}