This is an automated email from the ASF dual-hosted git repository.

ptupitsyn pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git


The following commit(s) were added to refs/heads/main by this push:
     new b54f5bbc0c IGNITE-20524 Fix nullable annotations and javadoc in 
KeyValueView (#2818)
b54f5bbc0c is described below

commit b54f5bbc0c5867e72c51ad24985cdc9b3897dfb0
Author: Pavel Tupitsyn <ptupit...@apache.org>
AuthorDate: Thu Nov 9 07:42:00 2023 +0200

    IGNITE-20524 Fix nullable annotations and javadoc in KeyValueView (#2818)
    
    `KeyValueView` allows null value in all methods when `OneColumnMapper` is 
used. Reflect this in Javadoc and add `@Nullable` annotations accordingly.
---
 .../java/org/apache/ignite/table/KeyValueView.java | 89 +++++++++++-----------
 .../internal/client/table/ClientKeyValueView.java  | 12 ++-
 .../ignite/internal/marshaller/FieldAccessor.java  |  6 +-
 .../ignite/internal/marshaller/Marshaller.java     |  6 +-
 .../internal/schema/marshaller/KvMarshaller.java   |  2 +-
 .../marshaller/reflection/KvMarshallerImpl.java    |  4 +-
 .../marshaller/reflection/ObjectStatistics.java    |  6 +-
 .../ignite/internal/table/KeyValueViewImpl.java    | 38 ++++-----
 8 files changed, 86 insertions(+), 77 deletions(-)

diff --git 
a/modules/api/src/main/java/org/apache/ignite/table/KeyValueView.java 
b/modules/api/src/main/java/org/apache/ignite/table/KeyValueView.java
index 1bc9f99c2b..2ce7d764e8 100644
--- a/modules/api/src/main/java/org/apache/ignite/table/KeyValueView.java
+++ b/modules/api/src/main/java/org/apache/ignite/table/KeyValueView.java
@@ -49,7 +49,7 @@ public interface KeyValueView<K, V> extends 
DataStreamerTarget<Entry<K, V>> {
      * @throws UnexpectedNullValueException If value for the key exists, and 
it is {@code null}.
      * @see #getNullable(Transaction, Object)
      */
-    V get(@Nullable Transaction tx, K key);
+    @Nullable V get(@Nullable Transaction tx, K key);
 
     /**
      * Asynchronously gets a value associated with a given key.
@@ -96,7 +96,7 @@ public interface KeyValueView<K, V> extends 
DataStreamerTarget<Entry<K, V>> {
      * @return Value or {@code defaultValue} if does not exist.
      * @throws MarshallerException if the key doesn't match the schema.
      */
-    V getOrDefault(@Nullable Transaction tx, K key, V defaultValue);
+    @Nullable V getOrDefault(@Nullable Transaction tx, K key, @Nullable V 
defaultValue);
 
     /**
      * Gets a value associated with a given key, if it exists and is not null, 
otherwise returns {@code defaultValue}.
@@ -108,7 +108,7 @@ public interface KeyValueView<K, V> extends 
DataStreamerTarget<Entry<K, V>> {
      * @throws MarshallerException if the key doesn't match the schema.
      * @see #getOrDefault(Transaction, Object, Object)
      */
-    CompletableFuture<V> getOrDefaultAsync(@Nullable Transaction tx, K key, V 
defaultValue);
+    CompletableFuture<V> getOrDefaultAsync(@Nullable Transaction tx, K key, 
@Nullable V defaultValue);
 
     /**
      * Get values associated with given keys.
@@ -155,21 +155,21 @@ public interface KeyValueView<K, V> extends 
DataStreamerTarget<Entry<K, V>> {
      *
      * @param tx Transaction or {@code null} to auto-commit.
      * @param key Key with which the specified value is to be associated. The 
key cannot be {@code null}.
-     * @param val Value to be associated with the specified key.
+     * @param val Value to be associated with the specified key. Can be null 
when mapped to a single column with a simple type.
      * @throws MarshallerException if the key and/or the value doesn't match 
the schema.
      */
-    void put(@Nullable Transaction tx, K key, V val);
+    void put(@Nullable Transaction tx, K key, @Nullable V val);
 
     /**
      * Asynchronously puts into a table a value associated with the given key.
      *
      * @param tx Transaction or {@code null} to auto-commit.
      * @param key Key with which the specified value is to be associated. The 
key cannot be {@code null}.
-     * @param val Value to be associated with the specified key.
+     * @param val Value to be associated with the specified key. Can be null 
when mapped to a single column with a simple type.
      * @return Future that represents the pending completion of the operation.
      * @throws MarshallerException if the key and/or the value doesn't match 
the schema.
      */
-    CompletableFuture<Void> putAsync(@Nullable Transaction tx, K key, V val);
+    CompletableFuture<Void> putAsync(@Nullable Transaction tx, K key, 
@Nullable V val);
 
     /**
      * Puts associated key-value pairs.
@@ -193,73 +193,74 @@ public interface KeyValueView<K, V> extends 
DataStreamerTarget<Entry<K, V>> {
     /**
      * Puts into a table a new, or replaces an existing, value associated with 
the given key.
      *
-     * <p>NB: The method doesn't support {@code null} value, use {@link 
#getNullableAndPut(Transaction, Object, Object)} instead.
+     * <p>NB: The method doesn't support {@code null} column value, use {@link 
#getNullableAndPut(Transaction, Object, Object)} instead.
      *
      * @param tx Transaction or {@code null} to auto-commit.
      * @param key Key with which the specified value is to be associated. The 
key cannot be {@code null}.
-     * @param val Value to be associated with the specified key. The value 
cannot be {@code null}.
+     * @param val Value to be associated with the specified key. Can be {@code 
null} when mapped to a single column with a simple type.
      * @return Replaced value or {@code null} if it did not exist.
      * @throws MarshallerException if one of the keys or values doesn't match 
the schema.
      * @throws UnexpectedNullValueException If value for the key exists, and 
it is {@code null}.
      */
-    V getAndPut(@Nullable Transaction tx, K key, V val);
+    @Nullable V getAndPut(@Nullable Transaction tx, K key, @Nullable V val);
 
     /**
      * Asynchronously puts into a table a new, or replaces an existing, value 
associated with given key.
      *
-     * <p>NB: The method doesn't support {@code null} value, use {@link 
#getNullableAndPutAsync(Transaction, Object, Object)} instead.
+     * <p>NB: The method doesn't support {@code null} column value, use {@link 
#getNullableAndPutAsync(Transaction, Object, Object)}
+     *     instead.
      *
      * @param tx Transaction or {@code null} to auto-commit.
      * @param key Key with which the specified value is to be associated. The 
key cannot be {@code null}.
-     * @param val Value to be associated with the specified key. The value 
cannot be {@code null}.
+     * @param val Value to be associated with the specified key. Can be {@code 
null} when mapped to a single column with a simple type.
      * @return Future that represents the pending completion of the operation.
      * @throws MarshallerException if the key and/or the value doesn't match 
the schema.
      */
-    CompletableFuture<V> getAndPutAsync(@Nullable Transaction tx, K key, V 
val);
+    CompletableFuture<V> getAndPutAsync(@Nullable Transaction tx, K key, 
@Nullable V val);
 
     /**
      * Puts into a table a new, or replaces an existing, value associated with 
given key.
      *
      * @param tx Transaction or {@code null} to auto-commit.
      * @param key Key with which the specified value is to be associated. The 
key cannot be {@code null}.
-     * @param val Value to be associated with the specified key.
+     * @param val Value to be associated with the specified key. Can be {@code 
null} when mapped to a single column with a simple type.
      * @return Wrapped nullable value that was replaced or {@code null} if it 
did no exist.
      * @throws MarshallerException if the key and/or the value doesn't match 
the schema.
      */
-    NullableValue<V> getNullableAndPut(@Nullable Transaction tx, K key, V val);
+    NullableValue<V> getNullableAndPut(@Nullable Transaction tx, K key, 
@Nullable V val);
 
     /**
      * Asynchronously puts into a table a new, or replaces an existing, value 
associated with given key.
      *
      * @param tx Transaction or {@code null} to auto-commit.
      * @param key Key with which the specified value is to be associated. The 
key cannot be {@code null}.
-     * @param val Value to be associated with the specified key.
+     * @param val Value to be associated with the specified key. Can be {@code 
null} when mapped to a single column with a simple type.
      * @return Future that represents the pending completion of the operation.
      * @throws MarshallerException if the key and/or the value doesn't match 
the schema.
      */
-    CompletableFuture<NullableValue<V>> getNullableAndPutAsync(@Nullable 
Transaction tx, K key, V val);
+    CompletableFuture<NullableValue<V>> getNullableAndPutAsync(@Nullable 
Transaction tx, K key, @Nullable V val);
 
     /**
      * Puts into a table a value associated with the given key if this value 
does not exists.
      *
      * @param tx Transaction or {@code null} to auto-commit.
      * @param key Key with which the specified value is to be associated. The 
key cannot be {@code null}.
-     * @param val Value to be associated with the specified key.
+     * @param val Value to be associated with the specified key. Can be {@code 
null} when mapped to a single column with a simple type.
      * @return {@code True} if successful, {@code false} otherwise.
      * @throws MarshallerException if the key and/or the value doesn't match 
the schema.
      */
-    boolean putIfAbsent(@Nullable Transaction tx, K key, V val);
+    boolean putIfAbsent(@Nullable Transaction tx, K key, @Nullable V val);
 
     /**
      * Asynchronously puts into a table a value associated with the given key 
if this value does not exist.
      *
      * @param tx Transaction or {@code null} to auto-commit.
      * @param key Key with which the specified value is to be associated. The 
key cannot be {@code null}.
-     * @param val Value to be associated with the specified key.
+     * @param val Value to be associated with the specified key. Can be {@code 
null} when mapped to a single column with a simple type.
      * @return Future that represents the pending completion of the operation.
      * @throws MarshallerException if the key and/or the value doesn't match 
the schema.
      */
-    CompletableFuture<Boolean> putIfAbsentAsync(@Nullable Transaction tx, K 
key, V val);
+    CompletableFuture<Boolean> putIfAbsentAsync(@Nullable Transaction tx, K 
key, @Nullable V val);
 
     /**
      * Removes from a table a value associated with the given key.
@@ -326,7 +327,7 @@ public interface KeyValueView<K, V> extends 
DataStreamerTarget<Entry<K, V>> {
     /**
      * Gets and removes from a table a value associated with the given key.
      *
-     * <p>NB: Method doesn't support {@code null} value, use {@link 
#getNullableAndRemove(Transaction, Object)} instead.
+     * <p>NB: Method doesn't support {@code null} column value, use {@link 
#getNullableAndRemove(Transaction, Object)} instead.
      *
      * @param tx Transaction or {@code null} to auto-commit.
      * @param key Key whose value is to be removed from the table. The key 
cannot be {@code null}.
@@ -334,12 +335,12 @@ public interface KeyValueView<K, V> extends 
DataStreamerTarget<Entry<K, V>> {
      * @throws UnexpectedNullValueException If the key value is {@code null}.
      * @throws MarshallerException if the key doesn't match the schema.
      */
-    V getAndRemove(@Nullable Transaction tx, K key);
+    @Nullable V getAndRemove(@Nullable Transaction tx, K key);
 
     /**
      * Asynchronously gets and removes from a table a value associated with 
the given key.
      *
-     * <p>NB: Method doesn't support {@code null} value, use {@link 
#getNullableAndRemoveAsync(Transaction, Object)} instead.
+     * <p>NB: Method doesn't support {@code null} column value, use {@link 
#getNullableAndRemoveAsync(Transaction, Object)} instead.
      *
      * @param tx Transaction or {@code null} to auto-commit.
      * @param key Key whose value is to be removed from the table. The key 
cannot be {@code null}.
@@ -381,11 +382,11 @@ public interface KeyValueView<K, V> extends 
DataStreamerTarget<Entry<K, V>> {
      *
      * @param tx Transaction or {@code null} to auto-commit.
      * @param key Key the specified value is associated with. The key cannot 
be {@code null}.
-     * @param val Value to be associated with the specified key.
+     * @param val Value to be associated with the specified key. Can be {@code 
null} when mapped to a single column with a simple type.
      * @return {@code True} if an old value was replaced, {@code false} 
otherwise.
      * @throws MarshallerException if the key and/or the value doesn't match 
the schema.
      */
-    boolean replace(@Nullable Transaction tx, K key, V val);
+    boolean replace(@Nullable Transaction tx, K key, @Nullable V val);
 
     /**
      * Replaces an expected value for a key. This is equivalent to
@@ -401,34 +402,35 @@ public interface KeyValueView<K, V> extends 
DataStreamerTarget<Entry<K, V>> {
      * @param tx Transaction or {@code null} to auto-commit.
      * @param key Key the specified value is associated with. The key cannot 
be {@code null}.
      * @param oldValue Expected value associated with the specified key.
-     * @param newValue Value to be associated with the specified key.
+     * @param newValue Value to be associated with the specified key. Can be 
{@code null} when mapped to a single column with a simple type.
      * @return {@code True} if an old value was replaced, {@code false} 
otherwise.
      * @throws MarshallerException if the key, the oldValue, or the newValue 
doesn't match the schema.
      */
-    boolean replace(@Nullable Transaction tx, K key, V oldValue, V newValue);
+    boolean replace(@Nullable Transaction tx, K key, V oldValue, @Nullable V 
newValue);
 
     /**
      * Asynchronously replaces a value for a key if it exists. See {@link 
#replace(Transaction, Object, Object)}.
      *
      * @param tx Transaction or {@code null} to auto-commit.
      * @param key Key the specified value is associated with. The key cannot 
be {@code null}.
-     * @param val Value to be associated with the specified key.
+     * @param val Value to be associated with the specified key. Can be {@code 
null} when mapped to a single column with a simple type.
      * @return Future that represents the pending completion of the operation.
      * @throws MarshallerException if the key or the oldValue doesn't match 
the schema.
      */
-    CompletableFuture<Boolean> replaceAsync(@Nullable Transaction tx, K key, V 
val);
+    CompletableFuture<Boolean> replaceAsync(@Nullable Transaction tx, K key, 
@Nullable V val);
 
     /**
      * Asynchronously replaces an expected value for a key. See {@link 
#replace(Transaction, Object, Object, Object)}
      *
      * @param tx Transaction or {@code null} to auto-commit.
      * @param key Key the specified value is associated with. The key cannot 
be {@code null}.
-     * @param oldVal Expected value associated with the specified key.
-     * @param newVal Value to be associated with the specified key.
+     * @param oldVal Expected value associated with the specified key. Can be 
{@code null} when mapped to a single column
+     *     with a simple type.
+     * @param newVal Value to be associated with the specified key. Can be 
{@code null} when mapped to a single column with a simple type.
      * @return Future that represents the pending completion of the operation.
      * @throws MarshallerException if the key, the oldValue, or the newValue 
doesn't match the schema.
      */
-    CompletableFuture<Boolean> replaceAsync(@Nullable Transaction tx, K key, V 
oldVal, V newVal);
+    CompletableFuture<Boolean> replaceAsync(@Nullable Transaction tx, K key, 
@Nullable V oldVal, @Nullable V newVal);
 
     /**
      * Replaces a value for a given key if it exists. This is equivalent to
@@ -443,52 +445,53 @@ public interface KeyValueView<K, V> extends 
DataStreamerTarget<Entry<K, V>> {
      * </code></pre>
      * except the action is performed atomically.
      *
-     * <p>NB: Method doesn't support {@code null} value, use {@link 
#getNullableAndReplace(Transaction, Object, Object)} instead.
+     * <p>NB: Method doesn't support {@code null} column value, use {@link 
#getNullableAndReplace(Transaction, Object, Object)} instead.
      *
      * @param tx Transaction or {@code null} to auto-commit.
      * @param key Key the specified value is associated with. The key cannot 
be {@code null}.
-     * @param val Value to be associated with the specified key. The value 
cannot be {@code null}.
+     * @param val Value to be associated with the specified key. Can be {@code 
null} when mapped to a single column with a simple type.
      * @return Replaced value, or {@code null} if it did not exist.
      * @throws UnexpectedNullValueException If the value for the key is {@code 
null}.
      * @throws MarshallerException if the key, or the value doesn't match the 
schema.
      */
-    V getAndReplace(@Nullable Transaction tx, K key, V val);
+    @Nullable V getAndReplace(@Nullable Transaction tx, @Nullable K key, 
@Nullable V val);
 
     /**
      * Asynchronously replaces a value for a given key if it exists.
      *
-     * <p>NB: Method doesn't support {@code null} value, use {@link 
#getNullableAndReplaceAsync(Transaction, Object, Object)} instead.
+     * <p>NB: Method doesn't support {@code null} column value, use {@link 
#getNullableAndReplaceAsync(Transaction, Object, Object)}
+     *     instead.
      *
      * @param tx Transaction or {@code null} to auto-commit.
      * @param key Key the specified value is associated with. The key cannot 
be {@code null}.
-     * @param val Value to be associated with the specified key.
+     * @param val Value to be associated with the specified key. Can be {@code 
null} when mapped to a single column with a simple type.
      * @return Future that represents the pending completion of the operation.
      * @throws MarshallerException if the key or the value doesn't match the 
schema.
      * @see #getAndReplace(Transaction, Object, Object)
      */
-    CompletableFuture<V> getAndReplaceAsync(@Nullable Transaction tx, K key, V 
val);
+    CompletableFuture<V> getAndReplaceAsync(@Nullable Transaction tx, K key, 
@Nullable V val);
 
     /**
      * Replaces a value for a given key if it exists.
      *
      * @param tx Transaction or {@code null} to auto-commit.
      * @param key Key the specified value is associated with. The key cannot 
be {@code null}.
-     * @param val Value to be associated with the specified key.
+     * @param val Value to be associated with the specified key. Can be {@code 
null} when mapped to a single column with a simple type.
      * @return Wrapped nullable value that was replaced or {@code null} if it 
did not exist.
      * @throws MarshallerException if the key or the value doesn't match the 
schema.
      * @see #getAndReplace(Transaction, Object, Object)
      */
-    NullableValue<V> getNullableAndReplace(@Nullable Transaction tx, K key, V 
val);
+    NullableValue<V> getNullableAndReplace(@Nullable Transaction tx, K key, 
@Nullable V val);
 
     /**
      * Asynchronously replaces a value for a given key if it exists.
      *
      * @param tx Transaction or {@code null} to auto-commit.
      * @param key Key the specified value is associated with. The key cannot 
be {@code null}.
-     * @param val Value to be associated with the specified key.
+     * @param val Value to be associated with the specified key. Can be {@code 
null} when mapped to a single column with a simple type.
      * @return Future that represents the pending completion of the operation.
      * @throws MarshallerException if the key or the value doesn't match the 
schema.
      * @see #getAndReplace(Transaction, Object, Object)
      */
-    CompletableFuture<NullableValue<V>> getNullableAndReplaceAsync(@Nullable 
Transaction tx, K key, V val);
+    CompletableFuture<NullableValue<V>> getNullableAndReplaceAsync(@Nullable 
Transaction tx, K key, @Nullable V val);
 }
diff --git 
a/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientKeyValueView.java
 
b/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientKeyValueView.java
index c8f55c4dd7..2bccc85173 100644
--- 
a/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientKeyValueView.java
+++ 
b/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientKeyValueView.java
@@ -110,6 +110,7 @@ public class ClientKeyValueView<K, V> implements 
KeyValueView<K, V> {
     /** {@inheritDoc} */
     @Override
     public CompletableFuture<NullableValue<V>> getNullableAsync(@Nullable 
Transaction tx, K key) {
+        // TODO IGNITE-20807
         throw new UnsupportedOperationException("Not implemented yet.");
     }
 
@@ -122,6 +123,7 @@ public class ClientKeyValueView<K, V> implements 
KeyValueView<K, V> {
     /** {@inheritDoc} */
     @Override
     public CompletableFuture<V> getOrDefaultAsync(@Nullable Transaction tx, K 
key, V defaultValue) {
+        // TODO IGNITE-20807
         throw new UnsupportedOperationException("Not implemented yet.");
     }
 
@@ -221,9 +223,8 @@ public class ClientKeyValueView<K, V> implements 
KeyValueView<K, V> {
 
     /** {@inheritDoc} */
     @Override
-    public CompletableFuture<V> getAndPutAsync(@Nullable Transaction tx, K 
key, V val) {
+    public CompletableFuture<V> getAndPutAsync(@Nullable Transaction tx, K 
key, @Nullable V val) {
         Objects.requireNonNull(key);
-        Objects.requireNonNull(val);
 
         return tbl.doSchemaOutInOpAsync(
                 ClientOp.TUPLE_GET_AND_UPSERT,
@@ -242,6 +243,7 @@ public class ClientKeyValueView<K, V> implements 
KeyValueView<K, V> {
     /** {@inheritDoc} */
     @Override
     public CompletableFuture<NullableValue<V>> 
getNullableAndPutAsync(@Nullable Transaction tx, K key, V val) {
+        // TODO IGNITE-20807
         throw new UnsupportedOperationException("Not implemented yet.");
     }
 
@@ -350,6 +352,7 @@ public class ClientKeyValueView<K, V> implements 
KeyValueView<K, V> {
     /** {@inheritDoc} */
     @Override
     public CompletableFuture<NullableValue<V>> 
getNullableAndRemoveAsync(@Nullable Transaction tx, K key) {
+        // TODO IGNITE-20807
         throw new UnsupportedOperationException("Not implemented yet.");
     }
 
@@ -424,15 +427,16 @@ public class ClientKeyValueView<K, V> implements 
KeyValueView<K, V> {
     /** {@inheritDoc} */
     @Override
     public CompletableFuture<NullableValue<V>> 
getNullableAndReplaceAsync(@Nullable Transaction tx, K key, V val) {
+        // TODO IGNITE-20807
         throw new UnsupportedOperationException("Not implemented yet.");
     }
 
-    private void writeKeyValue(ClientSchema s, PayloadOutputChannel w, 
@Nullable Transaction tx, K key, V val) {
+    private void writeKeyValue(ClientSchema s, PayloadOutputChannel w, 
@Nullable Transaction tx, K key, @Nullable V val) {
         writeSchemaAndTx(s, w, tx);
         writeKeyValueRaw(s, w, key, val);
     }
 
-    private void writeKeyValueRaw(ClientSchema s, PayloadOutputChannel w, K 
key, V val) {
+    private void writeKeyValueRaw(ClientSchema s, PayloadOutputChannel w, K 
key, @Nullable V val) {
         var builder = new BinaryTupleBuilder(s.columns().length);
         var noValueSet = new BitSet();
         ClientMarshallerWriter writer = new ClientMarshallerWriter(builder, 
noValueSet);
diff --git 
a/modules/marshaller-common/src/main/java/org/apache/ignite/internal/marshaller/FieldAccessor.java
 
b/modules/marshaller-common/src/main/java/org/apache/ignite/internal/marshaller/FieldAccessor.java
index 56d9af2a3d..d6712b5b1e 100644
--- 
a/modules/marshaller-common/src/main/java/org/apache/ignite/internal/marshaller/FieldAccessor.java
+++ 
b/modules/marshaller-common/src/main/java/org/apache/ignite/internal/marshaller/FieldAccessor.java
@@ -394,7 +394,7 @@ abstract class FieldAccessor {
      * @param obj Source object.
      * @throws MarshallerException If failed.
      */
-    final void write(MarshallerWriter writer, Object obj) throws 
MarshallerException {
+    final void write(MarshallerWriter writer, @Nullable Object obj) throws 
MarshallerException {
         try {
             write0(writer, obj);
         } catch (Exception ex) {
@@ -409,7 +409,7 @@ abstract class FieldAccessor {
      * @param obj Source object.
      * @throws Exception If write failed.
      */
-    abstract void write0(MarshallerWriter writer, Object obj) throws Exception;
+    abstract void write0(MarshallerWriter writer, @Nullable Object obj) throws 
Exception;
 
     /**
      * Reads value fom row to object field.
@@ -786,7 +786,7 @@ abstract class FieldAccessor {
         }
 
         @Override
-        void write0(MarshallerWriter writer, Object obj) {
+        void write0(MarshallerWriter writer, @Nullable Object obj) {
             assert writer != null;
 
             if (obj == null) {
diff --git 
a/modules/marshaller-common/src/main/java/org/apache/ignite/internal/marshaller/Marshaller.java
 
b/modules/marshaller-common/src/main/java/org/apache/ignite/internal/marshaller/Marshaller.java
index fd06c87685..7adbd581d3 100644
--- 
a/modules/marshaller-common/src/main/java/org/apache/ignite/internal/marshaller/Marshaller.java
+++ 
b/modules/marshaller-common/src/main/java/org/apache/ignite/internal/marshaller/Marshaller.java
@@ -188,7 +188,7 @@ public abstract class Marshaller {
      * @param writer Row writer.
      * @throws MarshallerException If failed.
      */
-    public abstract void writeObject(Object obj, MarshallerWriter writer) 
throws MarshallerException;
+    public abstract void writeObject(@Nullable Object obj, MarshallerWriter 
writer) throws MarshallerException;
 
     /**
      * Marshaller for objects of natively supported types.
@@ -223,7 +223,7 @@ public abstract class Marshaller {
 
         /** {@inheritDoc} */
         @Override
-        public void writeObject(Object obj, MarshallerWriter writer) throws 
MarshallerException {
+        public void writeObject(@Nullable Object obj, MarshallerWriter writer) 
throws MarshallerException {
             fieldAccessor.write(writer, obj);
         }
     }
@@ -269,7 +269,7 @@ public abstract class Marshaller {
 
         /** {@inheritDoc} */
         @Override
-        public void writeObject(Object obj, MarshallerWriter writer) throws 
MarshallerException {
+        public void writeObject(@Nullable Object obj, MarshallerWriter writer) 
throws MarshallerException {
             for (int fldIdx = 0; fldIdx < fieldAccessors.length; fldIdx++) {
                 fieldAccessors[fldIdx].write(writer, obj);
             }
diff --git 
a/modules/schema/src/main/java/org/apache/ignite/internal/schema/marshaller/KvMarshaller.java
 
b/modules/schema/src/main/java/org/apache/ignite/internal/schema/marshaller/KvMarshaller.java
index 640aa659e6..bb9224ff2a 100644
--- 
a/modules/schema/src/main/java/org/apache/ignite/internal/schema/marshaller/KvMarshaller.java
+++ 
b/modules/schema/src/main/java/org/apache/ignite/internal/schema/marshaller/KvMarshaller.java
@@ -51,7 +51,7 @@ public interface KvMarshaller<K, V> {
      * @return Table row with columns from given key-value pair.
      * @throws MarshallerException If failed to marshal key and/or value.
      */
-    Row marshal(K key, V val) throws MarshallerException;
+    Row marshal(K key, @Nullable V val) throws MarshallerException;
 
     /**
      * Unmarshal given row to a key object.
diff --git 
a/modules/schema/src/main/java/org/apache/ignite/internal/schema/marshaller/reflection/KvMarshallerImpl.java
 
b/modules/schema/src/main/java/org/apache/ignite/internal/schema/marshaller/reflection/KvMarshallerImpl.java
index 88bedaba59..45d3ebd888 100644
--- 
a/modules/schema/src/main/java/org/apache/ignite/internal/schema/marshaller/reflection/KvMarshallerImpl.java
+++ 
b/modules/schema/src/main/java/org/apache/ignite/internal/schema/marshaller/reflection/KvMarshallerImpl.java
@@ -87,7 +87,7 @@ public class KvMarshallerImpl<K, V> implements 
KvMarshaller<K, V> {
 
     /** {@inheritDoc} */
     @Override
-    public Row marshal(K key, V val) throws MarshallerException {
+    public Row marshal(K key, @Nullable V val) throws MarshallerException {
         assert keyClass.isInstance(key);
         assert val == null || valClass.isInstance(val);
 
@@ -153,7 +153,7 @@ public class KvMarshallerImpl<K, V> implements 
KvMarshaller<K, V> {
      * @return Row assembler.
      * @throws MarshallerException If failed to read key or value object 
content.
      */
-    private RowAssembler createAssembler(Object key, Object val) throws 
MarshallerException {
+    private RowAssembler createAssembler(Object key, @Nullable Object val) 
throws MarshallerException {
         try {
             return ObjectStatistics.createAssembler(schema, keyMarsh, 
valMarsh, key, val);
         } catch (Throwable e) {
diff --git 
a/modules/schema/src/main/java/org/apache/ignite/internal/schema/marshaller/reflection/ObjectStatistics.java
 
b/modules/schema/src/main/java/org/apache/ignite/internal/schema/marshaller/reflection/ObjectStatistics.java
index 05ad88bcd1..36040a9009 100644
--- 
a/modules/schema/src/main/java/org/apache/ignite/internal/schema/marshaller/reflection/ObjectStatistics.java
+++ 
b/modules/schema/src/main/java/org/apache/ignite/internal/schema/marshaller/reflection/ObjectStatistics.java
@@ -25,6 +25,7 @@ import org.apache.ignite.internal.schema.Columns;
 import org.apache.ignite.internal.schema.SchemaDescriptor;
 import org.apache.ignite.internal.schema.row.RowAssembler;
 import org.apache.ignite.internal.type.NativeType;
+import org.jetbrains.annotations.Nullable;
 
 /**
  * Object statistic.
@@ -48,7 +49,7 @@ class ObjectStatistics {
     /**
      * Reads object fields and gather statistic.
      */
-    private static ObjectStatistics collectObjectStats(Columns cols, 
Marshaller marsh, Object obj) {
+    private static ObjectStatistics collectObjectStats(Columns cols, 
Marshaller marsh, @Nullable Object obj) {
         if (obj == null) {
             return ZERO_STATISTICS;
         }
@@ -84,7 +85,8 @@ class ObjectStatistics {
         return new RowAssembler(schema.keyColumns(), null, schema.version(), 
totalValueSize);
     }
 
-    static RowAssembler createAssembler(SchemaDescriptor schema, Marshaller 
keyMarsh, Marshaller valMarsh, Object key, Object val) {
+    static RowAssembler createAssembler(
+            SchemaDescriptor schema, Marshaller keyMarsh, Marshaller valMarsh, 
Object key, @Nullable Object val) {
         ObjectStatistics keyStat = collectObjectStats(schema.keyColumns(), 
keyMarsh, key);
         ObjectStatistics valStat = collectObjectStats(schema.valueColumns(), 
valMarsh, val);
 
diff --git 
a/modules/table/src/main/java/org/apache/ignite/internal/table/KeyValueViewImpl.java
 
b/modules/table/src/main/java/org/apache/ignite/internal/table/KeyValueViewImpl.java
index 2d92efd9bd..8f1179e251 100644
--- 
a/modules/table/src/main/java/org/apache/ignite/internal/table/KeyValueViewImpl.java
+++ 
b/modules/table/src/main/java/org/apache/ignite/internal/table/KeyValueViewImpl.java
@@ -181,13 +181,13 @@ public class KeyValueViewImpl<K, V> extends 
AbstractTableView implements KeyValu
 
     /** {@inheritDoc} */
     @Override
-    public void put(@Nullable Transaction tx, K key, V val) {
+    public void put(@Nullable Transaction tx, K key, @Nullable V val) {
         sync(putAsync(tx, key, val));
     }
 
     /** {@inheritDoc} */
     @Override
-    public CompletableFuture<Void> putAsync(@Nullable Transaction tx, K key, V 
val) {
+    public CompletableFuture<Void> putAsync(@Nullable Transaction tx, K key, 
@Nullable V val) {
         Objects.requireNonNull(key);
 
         return withSchemaSync(tx, (schemaVersion) -> {
@@ -220,13 +220,13 @@ public class KeyValueViewImpl<K, V> extends 
AbstractTableView implements KeyValu
 
     /** {@inheritDoc} */
     @Override
-    public V getAndPut(@Nullable Transaction tx, K key, V val) {
+    public V getAndPut(@Nullable Transaction tx, K key, @Nullable V val) {
         return sync(getAndPutAsync(tx, key, val));
     }
 
     /** {@inheritDoc} */
     @Override
-    public CompletableFuture<V> getAndPutAsync(@Nullable Transaction tx, K 
key, V val) {
+    public CompletableFuture<V> getAndPutAsync(@Nullable Transaction tx, K 
key, @Nullable V val) {
         Objects.requireNonNull(key);
         Objects.requireNonNull(val);
 
@@ -238,13 +238,13 @@ public class KeyValueViewImpl<K, V> extends 
AbstractTableView implements KeyValu
 
     /** {@inheritDoc} */
     @Override
-    public NullableValue<V> getNullableAndPut(@Nullable Transaction tx, K key, 
V val) {
+    public NullableValue<V> getNullableAndPut(@Nullable Transaction tx, K key, 
@Nullable V val) {
         return sync(getNullableAndPutAsync(tx, key, val));
     }
 
     /** {@inheritDoc} */
     @Override
-    public CompletableFuture<NullableValue<V>> 
getNullableAndPutAsync(@Nullable Transaction tx, K key, V val) {
+    public CompletableFuture<NullableValue<V>> 
getNullableAndPutAsync(@Nullable Transaction tx, K key, @Nullable V val) {
         Objects.requireNonNull(key);
 
         return withSchemaSync(tx, (schemaVersion) -> {
@@ -257,13 +257,13 @@ public class KeyValueViewImpl<K, V> extends 
AbstractTableView implements KeyValu
 
     /** {@inheritDoc} */
     @Override
-    public boolean putIfAbsent(@Nullable Transaction tx, K key, V val) {
+    public boolean putIfAbsent(@Nullable Transaction tx, K key, @Nullable V 
val) {
         return sync(putIfAbsentAsync(tx, key, val));
     }
 
     /** {@inheritDoc} */
     @Override
-    public CompletableFuture<Boolean> putIfAbsentAsync(@Nullable Transaction 
tx, K key, V val) {
+    public CompletableFuture<Boolean> putIfAbsentAsync(@Nullable Transaction 
tx, K key, @Nullable V val) {
         Objects.requireNonNull(key);
 
         return withSchemaSync(tx, (schemaVersion) -> {
@@ -281,7 +281,7 @@ public class KeyValueViewImpl<K, V> extends 
AbstractTableView implements KeyValu
 
     /** {@inheritDoc} */
     @Override
-    public boolean remove(@Nullable Transaction tx, K key, V val) {
+    public boolean remove(@Nullable Transaction tx, K key, @Nullable V val) {
         return sync(removeAsync(tx, key, val));
     }
 
@@ -299,7 +299,7 @@ public class KeyValueViewImpl<K, V> extends 
AbstractTableView implements KeyValu
 
     /** {@inheritDoc} */
     @Override
-    public CompletableFuture<Boolean> removeAsync(@Nullable Transaction tx, K 
key, V val) {
+    public CompletableFuture<Boolean> removeAsync(@Nullable Transaction tx, K 
key, @Nullable V val) {
         Objects.requireNonNull(key);
 
         return withSchemaSync(tx, (schemaVersion) -> {
@@ -367,19 +367,19 @@ public class KeyValueViewImpl<K, V> extends 
AbstractTableView implements KeyValu
 
     /** {@inheritDoc} */
     @Override
-    public boolean replace(@Nullable Transaction tx, K key, V val) {
+    public boolean replace(@Nullable Transaction tx, K key, @Nullable V val) {
         return sync(replaceAsync(tx, key, val));
     }
 
     /** {@inheritDoc} */
     @Override
-    public boolean replace(@Nullable Transaction tx, K key, V oldVal, V 
newVal) {
+    public boolean replace(@Nullable Transaction tx, K key, @Nullable V 
oldVal, @Nullable V newVal) {
         return sync(replaceAsync(tx, key, oldVal, newVal));
     }
 
     /** {@inheritDoc} */
     @Override
-    public CompletableFuture<Boolean> replaceAsync(@Nullable Transaction tx, K 
key, V val) {
+    public CompletableFuture<Boolean> replaceAsync(@Nullable Transaction tx, K 
key, @Nullable V val) {
         Objects.requireNonNull(key);
 
         return withSchemaSync(tx, (schemaVersion) -> {
@@ -391,7 +391,7 @@ public class KeyValueViewImpl<K, V> extends 
AbstractTableView implements KeyValu
 
     /** {@inheritDoc} */
     @Override
-    public CompletableFuture<Boolean> replaceAsync(@Nullable Transaction tx, K 
key, V oldVal, V newVal) {
+    public CompletableFuture<Boolean> replaceAsync(@Nullable Transaction tx, K 
key, @Nullable V oldVal, @Nullable V newVal) {
         Objects.requireNonNull(key);
 
         return withSchemaSync(tx, (schemaVersion) -> {
@@ -404,13 +404,13 @@ public class KeyValueViewImpl<K, V> extends 
AbstractTableView implements KeyValu
 
     /** {@inheritDoc} */
     @Override
-    public V getAndReplace(@Nullable Transaction tx, K key, V val) {
+    public V getAndReplace(@Nullable Transaction tx, K key, @Nullable V val) {
         return sync(getAndReplaceAsync(tx, key, val));
     }
 
     /** {@inheritDoc} */
     @Override
-    public CompletableFuture<V> getAndReplaceAsync(@Nullable Transaction tx, K 
key, V val) {
+    public CompletableFuture<V> getAndReplaceAsync(@Nullable Transaction tx, K 
key, @Nullable V val) {
         Objects.requireNonNull(key);
         Objects.requireNonNull(val);
 
@@ -422,13 +422,13 @@ public class KeyValueViewImpl<K, V> extends 
AbstractTableView implements KeyValu
 
     /** {@inheritDoc} */
     @Override
-    public NullableValue<V> getNullableAndReplace(@Nullable Transaction tx, K 
key, V val) {
+    public NullableValue<V> getNullableAndReplace(@Nullable Transaction tx, K 
key, @Nullable V val) {
         return sync(getNullableAndReplaceAsync(tx, key, val));
     }
 
     /** {@inheritDoc} */
     @Override
-    public CompletableFuture<NullableValue<V>> 
getNullableAndReplaceAsync(@Nullable Transaction tx, K key, V val) {
+    public CompletableFuture<NullableValue<V>> 
getNullableAndReplaceAsync(@Nullable Transaction tx, K key, @Nullable V val) {
         Objects.requireNonNull(key);
 
         return withSchemaSync(tx, (schemaVersion) -> {
@@ -486,7 +486,7 @@ public class KeyValueViewImpl<K, V> extends 
AbstractTableView implements KeyValu
      * @param schemaVersion Schema version to use when marshalling.
      * @return Binary row.
      */
-    private BinaryRowEx marshal(K key, V val, int schemaVersion) {
+    private BinaryRowEx marshal(K key, @Nullable V val, int schemaVersion) {
         KvMarshaller<K, V> marsh = marshaller(schemaVersion);
 
         try {


Reply via email to