You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@ignite.apache.org by "Eduard Rakhmankulov (Jira)" <ji...@apache.org> on 2026/02/03 11:24:00 UTC
[jira] [Updated] (IGNITE-25403) Add overloads for common API methods that don't accept Transaction
[ https://issues.apache.org/jira/browse/IGNITE-25403?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Eduard Rakhmankulov updated IGNITE-25403:
-----------------------------------------
Labels: ignite-3 (was: )
> Add overloads for common API methods that don't accept Transaction
> ------------------------------------------------------------------
>
> Key: IGNITE-25403
> URL: https://issues.apache.org/jira/browse/IGNITE-25403
> Project: Ignite
> Issue Type: Improvement
> Reporter: Eduard Rakhmankulov
> Assignee: Eduard Rakhmankulov
> Priority: Major
> Labels: ignite-3
> Time Spent: 1h 50m
> Remaining Estimate: 0h
>
> All transactional API methods accept a Transaction. In real use, most of the time that parameter is null making all API calls starting with (null, ... which doesn't look good and is generally confusing. While this was to done to make sure the user doesn't forget to pass the transaction to all methods, it looks like this makes the API safe but too inconvenient.
> It is better to add overloads for at least some of the API methods that don't need the Transaction. It's the same as passing null.
> It's OK not to add these overloads to every single method. For example, if foo an operation foo there are two methods now
>
> {{foo(tx, args, opts)
> foo(tx, args)}}
> it's OK to only add one additional convenience method
>
> {{foo(args)}}
> i.e. not to add another overload to the more detailed method that also accepts operation options.
> Changes to API:
> new methods:
> {code:java}
> org.apache.ignite.table.KeyValueView#get(K)
> org.apache.ignite.table.KeyValueView#getAsync(K)
> org.apache.ignite.table.KeyValueView#getNullable(K)
> org.apache.ignite.table.KeyValueView#getNullableAsync(K)
> org.apache.ignite.table.KeyValueView#getOrDefault(K, V)
> org.apache.ignite.table.KeyValueView#getOrDefaultAsync(K, V)
> org.apache.ignite.table.KeyValueView#getAll(java.util.Collection<K>)
> org.apache.ignite.table.KeyValueView#getAllAsync(java.util.Collection<K>)
> org.apache.ignite.table.KeyValueView#contains(K)
> org.apache.ignite.table.KeyValueView#containsAsync(K)
> org.apache.ignite.table.KeyValueView#containsAll(java.util.Collection<K>)
> org.apache.ignite.table.KeyValueView#containsAllAsync(java.util.Collection<K>)
> org.apache.ignite.table.KeyValueView#put(K, V)
> org.apache.ignite.table.KeyValueView#putAsync(K, V)
> org.apache.ignite.table.KeyValueView#putAll(java.util.Map<K,V>)
> org.apache.ignite.table.KeyValueView#putAllAsync(java.util.Map<K,V>)
> org.apache.ignite.table.KeyValueView#getAndPut(K, V)
> org.apache.ignite.table.KeyValueView#getAndPutAsync(K, V)
> org.apache.ignite.table.KeyValueView#getNullableAndPut(K, V)
> org.apache.ignite.table.KeyValueView#getNullableAndPutAsync(K, V)
> org.apache.ignite.table.KeyValueView#putIfAbsent(K, V)
> org.apache.ignite.table.KeyValueView#putIfAbsentAsync(K, V)
> org.apache.ignite.table.KeyValueView#remove(K)
> org.apache.ignite.table.KeyValueView#removeExact(org.apache.ignite.tx.Transaction, K, V)
> org.apache.ignite.table.KeyValueView#removeExact(K, V)
> org.apache.ignite.table.KeyValueView#removeAsync(K)
> org.apache.ignite.table.KeyValueView#removeExactAsync(org.apache.ignite.tx.Transaction, K, V)
> org.apache.ignite.table.KeyValueView#removeExactAsync(K, V)
> org.apache.ignite.table.KeyValueView#removeAll()
> org.apache.ignite.table.KeyValueView#removeAllAsync()
> org.apache.ignite.table.KeyValueView#getAndRemove(K)
> org.apache.ignite.table.KeyValueView#getAndRemoveAsync(K)
> org.apache.ignite.table.KeyValueView#getNullableAndRemove(K)
> org.apache.ignite.table.KeyValueView#getNullableAndRemoveAsync(K)
> org.apache.ignite.table.KeyValueView#replace(K, V)
> org.apache.ignite.table.KeyValueView#replaceExact(org.apache.ignite.tx.Transaction, K, V, V)
> org.apache.ignite.table.KeyValueView#replaceExact(K, V, V)
> org.apache.ignite.table.KeyValueView#replaceAsync(K, V)
> org.apache.ignite.table.KeyValueView#replaceExactAsync(org.apache.ignite.tx.Transaction, K, V, V)
> org.apache.ignite.table.KeyValueView#replaceExactAsync(K, V, V)
> org.apache.ignite.table.KeyValueView#getAndReplace(K, V)
> org.apache.ignite.table.KeyValueView#getAndReplaceAsync(K, V)
> org.apache.ignite.table.KeyValueView#getNullableAndReplace(K, V)
> org.apache.ignite.table.KeyValueView#getNullableAndReplaceAsync(K, V)org.apache.ignite.table.RecordView#get(R)
> org.apache.ignite.table.RecordView#getAsync(R)
> org.apache.ignite.table.RecordView#getAll(java.util.Collection<R>)
> org.apache.ignite.table.RecordView#getAllAsync(java.util.Collection<R>)
> org.apache.ignite.table.RecordView#contains(R)
> org.apache.ignite.table.RecordView#containsAsync(R)
> org.apache.ignite.table.RecordView#containsAll(java.util.Collection<R>)
> org.apache.ignite.table.RecordView#containsAllAsync(java.util.Collection<R>)
> org.apache.ignite.table.RecordView#upsert(R)
> org.apache.ignite.table.RecordView#upsertAsync(R)
> org.apache.ignite.table.RecordView#upsertAll(java.util.Collection<R>)
> org.apache.ignite.table.RecordView#upsertAllAsync(java.util.Collection<R>)
> org.apache.ignite.table.RecordView#getAndUpsert(R)
> org.apache.ignite.table.RecordView#getAndUpsertAsync(R)
> org.apache.ignite.table.RecordView#insert(R)
> org.apache.ignite.table.RecordView#insertAsync(R)
> org.apache.ignite.table.RecordView#insertAll(java.util.Collection<R>)
> org.apache.ignite.table.RecordView#insertAllAsync(java.util.Collection<R>)
> org.apache.ignite.table.RecordView#replace(R)
> org.apache.ignite.table.RecordView#replaceExact(org.apache.ignite.tx.Transaction, R, R)
> org.apache.ignite.table.RecordView#replaceExact(R, R)
> org.apache.ignite.table.RecordView#replaceAsync(R)
> org.apache.ignite.table.RecordView#replaceExactAsync(org.apache.ignite.tx.Transaction, R, R)
> org.apache.ignite.table.RecordView#replaceExactAsync(R, R)
> org.apache.ignite.table.RecordView#getAndReplace(R)
> org.apache.ignite.table.RecordView#getAndReplaceAsync(R)
> org.apache.ignite.table.RecordView#delete(R)
> org.apache.ignite.table.RecordView#deleteAsync(R)
> org.apache.ignite.table.RecordView#deleteExact(R)
> org.apache.ignite.table.RecordView#deleteExactAsync(R)
> org.apache.ignite.table.RecordView#getAndDelete(R)
> org.apache.ignite.table.RecordView#getAndDeleteAsync(R)
> org.apache.ignite.table.RecordView#deleteAll()
> org.apache.ignite.table.RecordView#deleteAllAsync()
> org.apache.ignite.table.RecordView#deleteAllExact(java.util.Collection<R>)
> org.apache.ignite.table.RecordView#deleteAllExactAsync(java.util.Collection<R>)org.apache.ignite.sql.IgniteSql#execute(java.lang.String, java.lang.Object...)
> org.apache.ignite.sql.IgniteSql#executeAsync(java.lang.String, java.lang.Object...)
> org.apache.ignite.sql.IgniteSql#executeBatch(java.lang.String, org.apache.ignite.sql.BatchedArguments)
> org.apache.ignite.sql.IgniteSql#executeBatchAsync(java.lang.String, org.apache.ignite.sql.BatchedArguments){code}
> Deprecated methods:
> {code:java}
> org.apache.ignite.table.KeyValueView#remove(org.apache.ignite.tx.Transaction, K, V)
> org.apache.ignite.table.KeyValueView#removeAsync(org.apache.ignite.tx.Transaction, K, V)
> org.apache.ignite.table.KeyValueView#replace(org.apache.ignite.tx.Transaction, K, V, V)
> org.apache.ignite.table.KeyValueView#replaceAsync(org.apache.ignite.tx.Transaction, K, V, V)
> org.apache.ignite.table.RecordView#replace(org.apache.ignite.tx.Transaction, R, R)
> org.apache.ignite.table.RecordView#replaceAsync(org.apache.ignite.tx.Transaction, R, R){code}
>
> Compilation time conflict because of adding new overloads:
> {code:java}
> KeyValueView.java:
> 1. remove[Async](K,V) == remove[Async](Transaction, K) | example: remove(/*Transaction*/null, /*K*/key) | unlikely | in case when typeof(K) == typeof(V)
> 2. removeAll[Async](Collection<K>) == removeAll[Async](Transaction) | example: removeAll(/*Transaction*/ null) | CONFLICT |
> 3. replace[Async](K,V,V) == replace[Async](Transaction, K, V) | example: replace(/*Transaction*/ null, key, newVal) | unlikely | in case when typeof(K) == typeof(V)
> RecordView.java:
> 1. deleteAll[Async](Collection<R>) == deleteAll[Async](Transaction) | example deleteAll(/*Transaction*/ null) | CONFLICT
> 2. relpace[Async](R,R) == replace[Async](Transaction, R) | example replace(/*Transaction*/ null, record) | CONFLICT
> CriteriaQuerySource.java
> 1. query[Async](Criteria, String) == query[Async](Transaction, Criteria) | example query(/*Transaction*/ null, /*Criteria*/) | CONFLICT
> 2. query[Async](Criteria, String, CriteriaOptions) == query[Async](Transaction, Criteria, String) | example query(/*Transaction*/ null, /*Criteria*/ null, /*String*/ null) | CONFLICT
> IgniteSql.java
> 01. execute[Async](CancellationToken, String, Object...) == execute[Async](Transaction, String, Object...) | example execute[Async](/*Transaction*/ null, qry, args) | CONFLICT
> 02. execute[Async](CancellationToken, Statement, Object...) == execute[Async](Transaction, Statement, Object...) | example execute[Async](/*Transaction*/ null, stmt, args) | CONFLICT
> 03. execute[Async](CancellationToken, Mapper<T>, String, Object...) == execute[Async](Transaction, Mapper<T>, String, Object...) | example execute[Async](/*Transaction*/ null, mapper, qry, args) | CONFLICT
> 04. execute[Async](CancellationToken, Mapper<T>, Statement, Object...) == execute[Async](Transaction, Mapper<T>, Statement, Object...) | example execute[Async](/*Transaction*/ null, mapper, stmt, args) | CONFLICT
> 05. execute[Async](Mapper<T>, String, Object...) == execute[Async](Transaction, String, Object...) | example execute[Async](/*Transaction*/ null, qry, args) | CONFLICT
> 06. execute[Async](Mapper<T>, Statement, Object...) == execute[Async](Transaction, Statement, Object...) | example execute[Async](/*Transaction*/ null, stmt, args) | CONFLICT
> 07. execute[Async](String, Object...) == execute[Async](Transaction, String, Object...) | example execute[Async](/*Transaction*/ null, qry, arg0, arg1) | CONFLICT
> 08. execute[Async](Statement, Object...) == execute[Async](Transaction, String, Object...) | example execute[Async](/*Transaction*/ null, qry, arg0, arg1) | CONFLICT
> 09. execute[Async](String, Object...) == execute[Async](Transaction, Statement, Object...) | example execute[Async](/*Transaction*/ null, stmt, arg0, arg1) | CONFLICT
> 10. execute[Async](Statement, Object...) == execute[Async](Transaction, Statement, Object...) | example execute[Async](/*Transaction*/ null, stmt, arg0, arg1) | CONFLICT
> -------AND MORE with execute[Async]------
> 20. executeBatch[Async](CancellationToken, String, BatchedArguments) == execute[Async](Transaction, String, BatchedArguments) | example executeBatch[Async](/*Transaction*/ null, qry, args) | CONFLICT
> 21. executeBatch[Async](CancellationToken, Statement, BatchedArguments) == execute[Async](Transaction, Statement, BatchedArguments) | example executeBatch[Async](/*Transaction*/ null, stmt, args) | CONFLICT{code}
>
--
This message was sent by Atlassian Jira
(v8.20.10#820010)