blob: bb7a0bec409ddda580ae5dd60dc2929f74b6bb4b [file] [log] [blame]
/*
* 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.
*/
#pragma once
#include "ignite/client/detail/type_mapping_utils.h"
#include "ignite/client/table/ignite_tuple.h"
#include "ignite/client/transaction/transaction.h"
#include "ignite/client/type_mapping.h"
#include "ignite/common/detail/config.h"
#include "ignite/common/ignite_result.h"
#include <memory>
#include <type_traits>
#include <utility>
#include <vector>
namespace ignite {
class table;
namespace detail {
class table_impl;
}
template<typename K, typename V>
class key_value_view;
/**
* Key-Value view interface provides methods to access table records in form of separate key and value parts.
*/
template<>
class key_value_view<ignite_tuple, ignite_tuple> {
friend class table;
public:
typedef ignite_tuple key_type;
typedef ignite_tuple value_type;
// Deleted
key_value_view(const key_value_view &) = delete;
key_value_view &operator=(const key_value_view &) = delete;
// Default
key_value_view() = default;
key_value_view(key_value_view &&) noexcept = default;
key_value_view &operator=(key_value_view &&) noexcept = default;
/**
* Gets a value by key asynchronously.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param key Key.
* @param callback Callback which is called on success with value if it
* exists and @c std::nullopt otherwise
*/
IGNITE_API void get_async(
transaction *tx, const key_type &key, ignite_callback<std::optional<value_type>> callback);
/**
* Gets a value by key.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param key Key.
* @return Value if exists and @c std::nullopt otherwise.
*/
[[nodiscard]] IGNITE_API std::optional<value_type> get(transaction *tx, const key_type &key) {
return sync<std::optional<value_type>>(
[this, tx, &key](auto callback) { get_async(tx, key, std::move(callback)); });
}
/**
* Gets multiple records by keys asynchronously.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param keys Keys.
* @param callback Callback that is called on operation completion. Called with
* resulting records with all columns filled from the table. The order of
* elements is guaranteed to be the same as the order of keys. If a record
* does not exist, the resulting element of the corresponding order is
* @c std::nullopt.
*/
IGNITE_API void get_all_async(
transaction *tx, std::vector<key_type> keys, ignite_callback<std::vector<std::optional<value_type>>> callback);
/**
* Gets multiple records by keys.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param keys Keys.
* @return Resulting records with all columns filled from the table.
* The order of elements is guaranteed to be the same as the order of
* keys. If a record does not exist, the resulting element of the
* corresponding order is @c std::nullopt.
*/
[[nodiscard]] IGNITE_API std::vector<std::optional<value_type>> get_all(
transaction *tx, std::vector<key_type> keys) {
return sync<std::vector<std::optional<value_type>>>([this, tx, keys = std::move(keys)](auto callback) mutable {
get_all_async(tx, std::move(keys), std::move(callback));
});
}
/**
* Asynchronously determines if the table contains an entry for the specified key.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param key Key.
* @param callback Callback which is called on success with value
* indicating whether value exists or not.
*/
IGNITE_API void contains_async(transaction *tx, const key_type &key, ignite_callback<bool> callback);
/**
* Determines if the table contains an entry for the specified key.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param key Key.
* @return Value indicating whether value exists or not.
*/
[[nodiscard]] IGNITE_API bool contains(transaction *tx, const key_type &key) {
return sync<bool>([this, tx, &key](auto callback) { contains_async(tx, key, std::move(callback)); });
}
/**
* Puts a value with a given key asynchronously.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param key Key.
* @param value Value.
* @param callback Callback.
*/
IGNITE_API void put_async(
transaction *tx, const key_type &key, const value_type &value, ignite_callback<void> callback);
/**
* Puts a value with a given key.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param key Key.
* @param value Value.
*/
IGNITE_API void put(transaction *tx, const key_type &key, const value_type &value) {
sync<void>([this, tx, &key, &value](auto callback) { put_async(tx, key, value, std::move(callback)); });
}
/**
* Puts multiple key-value pairs asynchronously.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param pairs Pairs to put.
* @param callback Callback that is called on operation completion.
*/
IGNITE_API void put_all_async(
transaction *tx, const std::vector<std::pair<key_type, value_type>> &pairs, ignite_callback<void> callback);
/**
* Puts multiple key-value pairs.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param pairs Pairs to put.
*/
IGNITE_API void put_all(transaction *tx, const std::vector<std::pair<key_type, value_type>> &pairs) {
sync<void>([this, tx, pairs](auto callback) mutable { put_all_async(tx, pairs, std::move(callback)); });
}
/**
* Puts a value with a given key and returns previous value for the key asynchronously.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param key Key.
* @param value Value.
* @param callback Callback. Called with a value which contains replaced
* value or @c std::nullopt if it did not exist.
*/
IGNITE_API void get_and_put_async(transaction *tx, const key_type &key, const value_type &value,
ignite_callback<std::optional<value_type>> callback);
/**
* Puts a value with a given key and returns previous value for the key.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param key Key.
* @param value Value.
* @return A replaced value or @c std::nullopt if it did not exist.
*/
[[nodiscard]] IGNITE_API std::optional<value_type> get_and_put(
transaction *tx, const key_type &key, const value_type &value) {
return sync<std::optional<value_type>>(
[this, tx, &key, &value](auto callback) { get_and_put_async(tx, key, value, std::move(callback)); });
}
/**
* Asynchronously puts a value with a given key if the specified key is not present in the table.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param key Key.
* @param value Value.
* @param callback Callback. Called with a value indicating whether the
* record was inserted. Equals @c false if a record with the same key
* already exists.
*/
IGNITE_API void put_if_absent_async(
transaction *tx, const key_type &key, const value_type &value, ignite_callback<bool> callback);
/**
* Puts a value with a given key if the specified key is not present in the table.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param key Key.
* @param value Value.
*/
IGNITE_API bool put_if_absent(transaction *tx, const key_type &key, const value_type &value) {
return sync<bool>(
[this, tx, &key, &value](auto callback) { put_if_absent_async(tx, key, value, std::move(callback)); });
}
/**
* Removes a value with the specified key asynchronously.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param key Key.
* @param callback Callback that is called on operation completion. Called with
* a value indicating whether a record with the specified key was deleted.
*/
IGNITE_API void remove_async(transaction *tx, const key_type &key, ignite_callback<bool> callback);
/**
* Removes a value with the specified key.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param key Key.
* @return A value indicating whether a record with the specified key was deleted.
*/
IGNITE_API bool remove(transaction *tx, const key_type &key) {
return sync<bool>([this, tx, &key](auto callback) { remove_async(tx, key, std::move(callback)); });
}
/**
* Asynchronously removes a value with a given key from the table only if it is equal to the specified value.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param key Key.
* @param value Value.
* @param callback Callback that is called on operation completion. Called with
* a value indicating whether a record with the specified key was deleted.
*/
IGNITE_API void remove_async(
transaction *tx, const key_type &key, const value_type &value, ignite_callback<bool> callback);
/**
* Removes a value with a given key from the table only if it is equal to the specified value.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param key Key.
* @param value Value.
* @return A value indicating whether a record with the specified key was
* deleted.
*/
IGNITE_API bool remove(transaction *tx, const key_type &key, const value_type &value) {
return sync<bool>(
[this, tx, &key, &value](auto callback) { remove_async(tx, key, value, std::move(callback)); });
}
/**
* Removes values with given keys from the table asynchronously. If one or
* more keys do not exist, other values are still removed
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param keys Keys.
* @param callback Callback that is called on operation completion. Called with
* records from @c keys that did not exist.
*/
IGNITE_API void remove_all_async(
transaction *tx, std::vector<key_type> keys, ignite_callback<std::vector<key_type>> callback);
/**
* Removes values with given keys from the table. If one or more keys
* do not exist, other values are still removed
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param keys Keys.
* @return Records from @c keys that did not exist.
*/
IGNITE_API std::vector<key_type> remove_all(transaction *tx, std::vector<key_type> keys) {
return sync<std::vector<key_type>>([this, tx, keys = std::move(keys)](auto callback) mutable {
remove_all_async(tx, std::move(keys), std::move(callback));
});
}
/**
* Removes records with given keys and values from the table asynchronously.
* If one or more records do not exist, other records are still removed.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param pairs Pairs to remove.
* @param callback Callback that is called on operation completion. Called with
* records from @c records that did not exist.
*/
IGNITE_API void remove_all_async(transaction *tx, const std::vector<std::pair<key_type, value_type>> &pairs,
ignite_callback<std::vector<key_type>> callback);
/**
* Removes records with given keys and values from the table. If one or more
* records do not exist, other records are still removed.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param pairs Pairs to remove.
* @return Records from @c records that did not exist.
*/
IGNITE_API std::vector<key_type> remove_all(transaction *tx, std::vector<std::pair<key_type, value_type>> pairs) {
return sync<std::vector<key_type>>([this, tx, pairs = std::move(pairs)](auto callback) mutable {
remove_all_async(tx, std::move(pairs), std::move(callback));
});
}
/**
* Gets and removes a value associated with the given key asynchronously.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param key Key.
* @param callback Callback that is called on operation completion. Called with
* a removed record or @c std::nullopt if it did not exist.
*/
IGNITE_API void get_and_remove_async(
transaction *tx, const key_type &key, ignite_callback<std::optional<value_type>> callback);
/**
* Gets and removes a value associated with the given key.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param key key.
* @return A removed record or @c std::nullopt if it did not exist.
*/
IGNITE_API std::optional<value_type> get_and_remove(transaction *tx, const key_type &key) {
return sync<std::optional<value_type>>(
[this, tx, &key](auto callback) { get_and_remove_async(tx, key, std::move(callback)); });
}
/**
* Asynchronously replaces a record with the specified key if it exists,
* otherwise does nothing.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param key Key.
* @param value Value.
* @param callback Callback. Called with a value indicating whether a record
* with the specified key was replaced.
*/
IGNITE_API void replace_async(
transaction *tx, const key_type &key, const value_type &value, ignite_callback<bool> callback);
/**
* Replaces a record with the same key columns if it exists, otherwise does
* nothing.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param key Key.
* @param value Value.
* @return A value indicating whether a record with the specified key was
* replaced.
*/
IGNITE_API bool replace(transaction *tx, const key_type &key, const value_type &value) {
return sync<bool>(
[this, tx, &key, &value](auto callback) { replace_async(tx, key, value, std::move(callback)); });
}
/**
* Asynchronously replaces a value with a @c new_value one only if existing
* value equals to the specified @c old_value.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param key Key.
* @param old_value Value to be replaced.
* @param new_value New value.
* @param callback Callback. Called with a value indicating whether a
* specified record was replaced.
*/
IGNITE_API void replace_async(transaction *tx, const key_type &key, const value_type &old_value,
const value_type &new_value, ignite_callback<bool> callback);
/**
* Replaces a value with a @c new_value one only if existing value equals
* to the specified @c old_value.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param key Key.
* @param old_value Value to be replaced.
* @param new_value New value.
* @return A value indicating whether a specified record was replaced.
*/
IGNITE_API bool replace(
transaction *tx, const key_type &key, const value_type &old_value, const value_type &new_value) {
return sync<bool>([this, tx, &key, &old_value, &new_value](
auto callback) { replace_async(tx, key, old_value, new_value, std::move(callback)); });
}
/**
* Asynchronously replaces a record with the given key if it exists
* returning previous value.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param key Key.
* @param value Value.
* @param callback Callback. Called with a previous value for the given key,
* or @c std::nullopt if it did not exist.
*/
IGNITE_API void get_and_replace_async(transaction *tx, const key_type &key, const value_type &value,
ignite_callback<std::optional<value_type>> callback);
/**
* Replaces a record with the given key if it exists returning previous
* value.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param key Key.
* @param value Value.
* @param callback A previous value for the given key, or @c std::nullopt if
* it did not exist.
*/
[[nodiscard]] IGNITE_API std::optional<value_type> get_and_replace(
transaction *tx, const key_type &key, const value_type &value) {
return sync<std::optional<value_type>>(
[this, tx, &key, &value](auto callback) { get_and_replace_async(tx, key, value, std::move(callback)); });
}
private:
/**
* Constructor
*
* @param impl Implementation
*/
explicit key_value_view(std::shared_ptr<detail::table_impl> impl)
: m_impl(std::move(impl)) {}
/** Implementation. */
std::shared_ptr<detail::table_impl> m_impl;
};
/**
* Key-Value view interface provides methods to access table records in form of separate key and value parts.
*/
template<typename K, typename V>
class key_value_view {
friend class table;
public:
typedef typename std::decay<K>::type key_type;
typedef typename std::decay<V>::type value_type;
// Deleted
key_value_view(const key_value_view &) = delete;
key_value_view &operator=(const key_value_view &) = delete;
// Default
key_value_view() = default;
key_value_view(key_value_view &&) noexcept = default;
key_value_view &operator=(key_value_view &&) noexcept = default;
/**
* Gets a value by key asynchronously.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param key Key.
* @param callback Callback which is called on success with value if it
* exists and @c std::nullopt otherwise
*/
void get_async(transaction *tx, const key_type &key, ignite_callback<std::optional<value_type>> callback) {
m_delegate.get_async(tx, convert_to_tuple(key),
[callback = std::move(callback)](auto res) { callback(convert_result<value_type>(std::move(res))); });
}
/**
* Gets a value by key.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param key Key.
* @return Value if exists and @c std::nullopt otherwise.
*/
[[nodiscard]] std::optional<value_type> get(transaction *tx, const key_type &key) {
return sync<std::optional<value_type>>(
[this, tx, &key](auto callback) { get_async(tx, key, std::move(callback)); });
}
/**
* Gets multiple values by keys asynchronously.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param keys Keys.
* @param callback Callback that is called on operation completion. Called with
* resulting records with all columns filled from the table. The order of
* elements is guaranteed to be the same as the order of keys. If a record
* does not exist, the resulting element of the corresponding order is
* @c std::nullopt.
*/
void get_all_async(
transaction *tx, std::vector<key_type> keys, ignite_callback<std::vector<std::optional<value_type>>> callback) {
m_delegate.get_all_async(tx, values_to_tuples<key_type>(std::move(keys)),
[callback = std::move(callback)](auto res) { callback(convert_result<value_type>(std::move(res))); });
}
/**
* Gets multiple values by keys.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param keys Keys.
* @return Resulting records with all columns filled from the table.
* The order of elements is guaranteed to be the same as the order of
* keys. If a record does not exist, the resulting element of the
* corresponding order is @c std::nullopt.
*/
[[nodiscard]] std::vector<std::optional<value_type>> get_all(transaction *tx, std::vector<key_type> keys) {
return sync<std::vector<std::optional<value_type>>>([this, tx, keys = std::move(keys)](auto callback) mutable {
get_all_async(tx, std::move(keys), std::move(callback));
});
}
/**
* Asynchronously determines if the table contains a value for the specified key.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param key Key.
* @param callback Callback which is called on success with value
* indicating whether value exists or not.
*/
void contains_async(transaction *tx, const key_type &key, ignite_callback<bool> callback) {
m_delegate.contains_async(tx, convert_to_tuple(key), std::move(callback));
}
/**
* Determines if the table contains an entry for the specified key.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param key Key.
* @return Value indicating whether value exists or not.
*/
[[nodiscard]] bool contains(transaction *tx, const key_type &key) {
return sync<bool>([this, tx, &key](auto callback) { contains_async(tx, key, std::move(callback)); });
}
/**
* Puts a value with a given key asynchronously.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param key Key.
* @param value Value.
* @param callback Callback.
*/
void put_async(transaction *tx, const key_type &key, const value_type &value, ignite_callback<void> callback) {
m_delegate.put_async(tx, convert_to_tuple(key), convert_to_tuple(value), std::move(callback));
}
/**
* Puts a value with a given key.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param key Key.
* @param value Value.
*/
void put(transaction *tx, const key_type &key, const value_type &value) {
sync<void>([this, tx, &key, &value](auto callback) { put_async(tx, key, value, std::move(callback)); });
}
/**
* Puts multiple key-value pairs asynchronously.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param pairs Pairs to put.
* @param callback Callback that is called on operation completion.
*/
void put_all_async(
transaction *tx, const std::vector<std::pair<key_type, value_type>> &pairs, ignite_callback<void> callback) {
m_delegate.put_all_async(tx, values_to_tuples<key_type, value_type>(std::move(pairs)), std::move(callback));
}
/**
* Puts multiple key-value pairs.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param pairs Pairs to put.
*/
void put_all(transaction *tx, const std::vector<std::pair<key_type, value_type>> &pairs) {
sync<void>([this, tx, pairs](auto callback) mutable { put_all_async(tx, pairs, std::move(callback)); });
}
/**
* Puts a value with a given key and returns previous value for the key asynchronously.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param key Key.
* @param value Value.
* @param callback Callback. Called with a value which contains replaced
* value or @c std::nullopt if it did not exist.
*/
void get_and_put_async(transaction *tx, const key_type &key, const value_type &value,
ignite_callback<std::optional<value_type>> callback) {
m_delegate.get_and_put_async(tx, convert_to_tuple(key), convert_to_tuple(value),
[callback = std::move(callback)](auto res) { callback(convert_result<value_type>(std::move(res))); });
}
/**
* Puts a value with a given key and returns previous value for the key.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param key Key.
* @param value Value.
* @return A replaced value or @c std::nullopt if it did not exist.
*/
[[nodiscard]] std::optional<value_type> get_and_put(transaction *tx, const key_type &key, const value_type &value) {
return sync<std::optional<value_type>>(
[this, tx, &key, &value](auto callback) { get_and_put_async(tx, key, value, std::move(callback)); });
}
/**
* Asynchronously puts a value with a given key if the specified key is not present in the table.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param key Key.
* @param value Value.
* @param callback Callback. Called with a value indicating whether the
* record was inserted. Equals @c false if a record with the same key
* already exists.
*/
void put_if_absent_async(
transaction *tx, const key_type &key, const value_type &value, ignite_callback<bool> callback) {
m_delegate.put_if_absent_async(tx, convert_to_tuple(key), convert_to_tuple(value), std::move(callback));
}
/**
* Puts a value with a given key if the specified key is not present in the table.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param key Key.
* @param value Value.
*/
bool put_if_absent(transaction *tx, const key_type &key, const value_type &value) {
return sync<bool>(
[this, tx, &key, &value](auto callback) { put_if_absent_async(tx, key, value, std::move(callback)); });
}
/**
* Removes a value with the specified key asynchronously.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param key Key.
* @param callback Callback that is called on operation completion. Called with
* a value indicating whether a record with the specified key was deleted.
*/
void remove_async(transaction *tx, const key_type &key, ignite_callback<bool> callback) {
m_delegate.remove_async(tx, convert_to_tuple(key), std::move(callback));
}
/**
* Removes a value with the specified key.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param key Key.
* @return A value indicating whether a record with the specified key was deleted.
*/
bool remove(transaction *tx, const key_type &key) {
return sync<bool>([this, tx, &key](auto callback) { remove_async(tx, key, std::move(callback)); });
}
/**
* Asynchronously removes a value with a given key from the table only if it is equal to the specified value.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param key Key.
* @param value Value.
* @param callback Callback that is called on operation completion. Called with
* a value indicating whether a record with the specified key was deleted.
*/
void remove_async(transaction *tx, const key_type &key, const value_type &value, ignite_callback<bool> callback) {
m_delegate.remove_async(tx, convert_to_tuple(key), convert_to_tuple(value), std::move(callback));
}
/**
* Removes a value with a given key from the table only if it is equal to the specified value.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param key Key.
* @param value Value.
* @return A value indicating whether a record with the specified key was
* deleted.
*/
bool remove(transaction *tx, const key_type &key, const value_type &value) {
return sync<bool>(
[this, tx, &key, &value](auto callback) { remove_async(tx, key, value, std::move(callback)); });
}
/**
* Removes values with given keys from the table asynchronously. If one or
* more keys do not exist, other values are still removed
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param keys Keys.
* @param callback Callback that is called on operation completion. Called with
* records from @c keys that did not exist.
*/
void remove_all_async(
transaction *tx, std::vector<key_type> keys, ignite_callback<std::vector<key_type>> callback) {
m_delegate.remove_all_async(tx, values_to_tuples<key_type>(std::move(keys)),
[callback = std::move(callback)](auto res) { callback(convert_result<key_type>(std::move(res))); });
}
/**
* Removes values with given keys from the table. If one or more keys
* do not exist, other values are still removed
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param keys Keys.
* @return Records from @c keys that did not exist.
*/
std::vector<key_type> remove_all(transaction *tx, std::vector<key_type> keys) {
return sync<std::vector<key_type>>([this, tx, keys = std::move(keys)](auto callback) mutable {
remove_all_async(tx, std::move(keys), std::move(callback));
});
}
/**
* Removes records with given keys and values from the table asynchronously.
* If one or more records do not exist, other records are still removed.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param pairs Pairs to remove.
* @param callback Callback that is called on operation completion. Called with
* records from @c records that did not exist.
*/
void remove_all_async(transaction *tx, const std::vector<std::pair<key_type, value_type>> &pairs,
ignite_callback<std::vector<key_type>> callback) {
m_delegate.remove_all_async(tx, values_to_tuples<key_type, value_type>(std::move(pairs)),
[callback = std::move(callback)](auto res) { callback(convert_result<key_type>(std::move(res))); });
}
/**
* Removes records with given keys and values from the table. If one or more
* records do not exist, other records are still removed.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param pairs Pairs to remove.
* @return Records from @c records that did not exist.
*/
std::vector<key_type> remove_all(transaction *tx, std::vector<std::pair<key_type, value_type>> pairs) {
return sync<std::vector<key_type>>([this, tx, pairs = std::move(pairs)](auto callback) mutable {
remove_all_async(tx, std::move(pairs), std::move(callback));
});
}
/**
* Gets and removes a value associated with the given key asynchronously.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param key Key.
* @param callback Callback that is called on operation completion. Called with
* a removed record or @c std::nullopt if it did not exist.
*/
void get_and_remove_async(
transaction *tx, const key_type &key, ignite_callback<std::optional<value_type>> callback) {
m_delegate.get_and_remove_async(tx, convert_to_tuple(key),
[callback = std::move(callback)](auto res) { callback(convert_result<value_type>(std::move(res))); });
}
/**
* Gets and removes a value associated with the given key.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param key key.
* @return A removed record or @c std::nullopt if it did not exist.
*/
std::optional<value_type> get_and_remove(transaction *tx, const key_type &key) {
return sync<std::optional<value_type>>(
[this, tx, &key](auto callback) { get_and_remove_async(tx, key, std::move(callback)); });
}
/**
* Asynchronously replaces a record with the specified key if it exists, otherwise does nothing.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param key Key.
* @param value Value.
* @param callback Callback. Called with a value indicating whether a record
* with the specified key was replaced.
*/
void replace_async(transaction *tx, const key_type &key, const value_type &value, ignite_callback<bool> callback) {
m_delegate.replace_async(tx, convert_to_tuple(key), convert_to_tuple(value), std::move(callback));
}
/**
* Replaces a record with the same key columns if it exists, otherwise does
* nothing.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param key Key.
* @param value Value.
* @return A value indicating whether a record with the specified key was
* replaced.
*/
bool replace(transaction *tx, const key_type &key, const value_type &value) {
return sync<bool>(
[this, tx, &key, &value](auto callback) { replace_async(tx, key, value, std::move(callback)); });
}
/**
* Asynchronously replaces a value with a @c new_value one only if existing value equals to the specified
* @c old_value.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param key Key.
* @param old_value Value to be replaced.
* @param new_value New value.
* @param callback Callback. Called with a value indicating whether a
* specified record was replaced.
*/
void replace_async(transaction *tx, const key_type &key, const value_type &old_value, const value_type &new_value,
ignite_callback<bool> callback) {
m_delegate.replace_async(
tx, convert_to_tuple(key), convert_to_tuple(old_value), convert_to_tuple(new_value), std::move(callback));
}
/**
* Replaces a value with a @c new_value one only if existing value equals
* to the specified @c old_value.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param key Key.
* @param old_value Value to be replaced.
* @param new_value New value.
* @return A value indicating whether a specified record was replaced.
*/
bool replace(transaction *tx, const key_type &key, const value_type &old_value, const value_type &new_value) {
return sync<bool>([this, tx, &key, &old_value, &new_value](
auto callback) { replace_async(tx, key, old_value, new_value, std::move(callback)); });
}
/**
* Asynchronously replaces a record with the given key if it exists
* returning previous value.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param key Key.
* @param value Value.
* @param callback Callback. Called with a previous value for the given key,
* or @c std::nullopt if it did not exist.
*/
void get_and_replace_async(transaction *tx, const key_type &key, const value_type &value,
ignite_callback<std::optional<value_type>> callback) {
m_delegate.get_and_replace_async(tx, convert_to_tuple(key), convert_to_tuple(value),
[callback = std::move(callback)](auto res) { callback(convert_result<value_type>(std::move(res))); });
}
/**
* Replaces a record with the given key if it exists returning previous
* value.
*
* @param tx Optional transaction. If nullptr implicit transaction for this
* single operation is used.
* @param key Key.
* @param value Value.
* @param callback A previous value for the given key, or @c std::nullopt if
* it did not exist.
*/
[[nodiscard]] std::optional<value_type> get_and_replace(
transaction *tx, const key_type &key, const value_type &value) {
return sync<std::optional<value_type>>(
[this, tx, &key, &value](auto callback) { get_and_replace_async(tx, key, value, std::move(callback)); });
}
private:
/**
* Constructor
*
* @param impl Implementation
*/
explicit key_value_view(key_value_view<ignite_tuple, ignite_tuple> delegate)
: m_delegate(std::move(delegate)) {}
/** Delegate. */
key_value_view<ignite_tuple, ignite_tuple> m_delegate;
};
} // namespace ignite