You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by am...@apache.org on 2021/12/13 13:48:48 UTC
[ignite-3] 01/02: Add getAll/putAll tests.
This is an automated email from the ASF dual-hosted git repository.
amashenkov pushed a commit to branch ignite-16004
in repository https://gitbox.apache.org/repos/asf/ignite-3.git
commit f67db6b3216929e9fc4bbd8bf6a6b3604a7129e5
Author: Andrew Mashenkov <an...@gmail.com>
AuthorDate: Fri Dec 10 17:25:48 2021 +0300
Add getAll/putAll tests.
---
.../ignite/internal/table/KeyValueViewImpl.java | 61 +++++++++--
.../internal/table/RecordBinaryViewImpl.java | 2 +-
.../table/KeyValueBinaryViewOperationsTest.java | 114 ++++++++++-----------
.../KeyValueViewOperationsSimpleSchemaTest.java | 19 ++++
.../table/RecordBinaryViewOperationsTest.java | 46 ++++++---
5 files changed, 156 insertions(+), 86 deletions(-)
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 5441314..37fd4ad 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
@@ -18,11 +18,14 @@
package org.apache.ignite.internal.table;
import java.io.Serializable;
+import java.util.ArrayList;
import java.util.Collection;
+import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.CompletableFuture;
import java.util.function.Function;
+import java.util.stream.Collectors;
import org.apache.ignite.internal.schema.BinaryRow;
import org.apache.ignite.internal.schema.SchemaDescriptor;
import org.apache.ignite.internal.schema.SchemaRegistry;
@@ -30,6 +33,7 @@ import org.apache.ignite.internal.schema.marshaller.KvMarshaller;
import org.apache.ignite.internal.schema.marshaller.MarshallerException;
import org.apache.ignite.internal.schema.marshaller.reflection.KvMarshallerImpl;
import org.apache.ignite.internal.schema.row.Row;
+import org.apache.ignite.internal.util.Pair;
import org.apache.ignite.lang.IgniteException;
import org.apache.ignite.table.InvokeProcessor;
import org.apache.ignite.table.KeyValueView;
@@ -81,7 +85,7 @@ public class KeyValueViewImpl<K, V> extends AbstractTableView implements KeyValu
BinaryRow keyRow = marshal(Objects.requireNonNull(key), null);
return tbl.get(keyRow, tx)
- .thenApply(this::unmarshalValue); // row -> deserialized obj.
+ .thenApply(this::unmarshalValue); // row -> deserialized obj.
}
/**
@@ -98,7 +102,20 @@ public class KeyValueViewImpl<K, V> extends AbstractTableView implements KeyValu
@Override
public @NotNull
CompletableFuture<Map<K, V>> getAllAsync(@NotNull Collection<K> keys) {
- throw new UnsupportedOperationException("Not implemented yet.");
+ Objects.requireNonNull(keys);
+
+ List<BinaryRow> keyRows = new ArrayList<>(keys.size());
+
+ for (K keyRec : keys) {
+ final BinaryRow keyRow = marshal(keyRec, null);
+
+ keyRows.add(keyRow);
+ }
+
+ return tbl.getAll(keyRows, tx)
+ .thenApply(ts -> ts.stream().filter(Objects::nonNull)
+ .map(this::unmarshalPair)
+ .collect(Collectors.toMap(Pair::getFirst, Pair::getSecond)));
}
/**
@@ -151,7 +168,17 @@ public class KeyValueViewImpl<K, V> extends AbstractTableView implements KeyValu
@Override
public @NotNull
CompletableFuture<Void> putAllAsync(@NotNull Map<K, V> pairs) {
- throw new UnsupportedOperationException("Not implemented yet.");
+ Objects.requireNonNull(pairs);
+
+ List<BinaryRow> rows = new ArrayList<>(pairs.size());
+
+ for (Map.Entry<K, V> pair : pairs.entrySet()) {
+ final BinaryRow row = marshal(pair.getKey(), pair.getValue());
+
+ rows.add(row);
+ }
+
+ return tbl.upsertAll(rows, tx);
}
/**
@@ -336,8 +363,7 @@ public class KeyValueViewImpl<K, V> extends AbstractTableView implements KeyValu
* {@inheritDoc}
*/
@Override
- public @NotNull
- <R extends Serializable> CompletableFuture<R> invokeAsync(
+ public @NotNull <R extends Serializable> CompletableFuture<R> invokeAsync(
@NotNull K key,
InvokeProcessor<K, V, R> proc,
Serializable... args
@@ -361,8 +387,7 @@ public class KeyValueViewImpl<K, V> extends AbstractTableView implements KeyValu
* {@inheritDoc}
*/
@Override
- public @NotNull
- <R extends Serializable> CompletableFuture<Map<K, R>> invokeAllAsync(
+ public @NotNull <R extends Serializable> CompletableFuture<Map<K, R>> invokeAllAsync(
@NotNull Collection<K> keys,
InvokeProcessor<K, V, R> proc, Serializable... args
) {
@@ -417,6 +442,28 @@ public class KeyValueViewImpl<K, V> extends AbstractTableView implements KeyValu
}
/**
+ * Unmarshal value object from given binary row.
+ *
+ * @param binaryRow Binary row.
+ * @return Value object.
+ */
+ private Pair<K, V> unmarshalPair(BinaryRow binaryRow) {
+ if (binaryRow == null) {
+ return null;
+ }
+
+ Row row = schemaReg.resolve(binaryRow);
+
+ KvMarshaller<K, V> marshaller = marshaller(row.schemaVersion());
+
+ try {
+ return new Pair<>(marshaller.unmarshalKey(row), marshaller.unmarshalValue(row));
+ } catch (MarshallerException e) {
+ throw new IgniteException(e);
+ }
+ }
+
+ /**
* Marshal key-value pair to a row.
*
* @param key Key object.
diff --git a/modules/table/src/main/java/org/apache/ignite/internal/table/RecordBinaryViewImpl.java b/modules/table/src/main/java/org/apache/ignite/internal/table/RecordBinaryViewImpl.java
index b354a0c..4e1ea66 100644
--- a/modules/table/src/main/java/org/apache/ignite/internal/table/RecordBinaryViewImpl.java
+++ b/modules/table/src/main/java/org/apache/ignite/internal/table/RecordBinaryViewImpl.java
@@ -384,7 +384,7 @@ public class RecordBinaryViewImpl extends AbstractTableView implements RecordVie
return null;
}
- return schemaReg.resolve(rows).stream().map(TableRow::tuple).collect(toList());
+ return schemaReg.resolve(rows).stream().filter(Objects::nonNull).map(TableRow::tuple).collect(toList());
}
/**
diff --git a/modules/table/src/test/java/org/apache/ignite/internal/table/KeyValueBinaryViewOperationsTest.java b/modules/table/src/test/java/org/apache/ignite/internal/table/KeyValueBinaryViewOperationsTest.java
index 152e4dc..c4f3c5a 100644
--- a/modules/table/src/test/java/org/apache/ignite/internal/table/KeyValueBinaryViewOperationsTest.java
+++ b/modules/table/src/test/java/org/apache/ignite/internal/table/KeyValueBinaryViewOperationsTest.java
@@ -17,12 +17,15 @@
package org.apache.ignite.internal.table;
+import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.Answers.RETURNS_DEEP_STUBS;
+import java.util.List;
+import java.util.Map;
import org.apache.ignite.internal.schema.Column;
import org.apache.ignite.internal.schema.NativeTypes;
import org.apache.ignite.internal.schema.SchemaDescriptor;
@@ -30,12 +33,14 @@ import org.apache.ignite.internal.storage.basic.ConcurrentHashMapPartitionStorag
import org.apache.ignite.internal.table.distributed.storage.VersionedRowStore;
import org.apache.ignite.internal.table.impl.DummyInternalTableImpl;
import org.apache.ignite.internal.table.impl.DummySchemaManagerImpl;
+import org.apache.ignite.internal.tx.LockManager;
+import org.apache.ignite.internal.tx.TxManager;
import org.apache.ignite.internal.tx.impl.HeapLockManager;
import org.apache.ignite.internal.tx.impl.TxManagerImpl;
import org.apache.ignite.network.ClusterService;
import org.apache.ignite.table.KeyValueView;
import org.apache.ignite.table.Tuple;
-import org.junit.jupiter.api.Assertions;
+import org.jetbrains.annotations.NotNull;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
@@ -46,27 +51,6 @@ import org.mockito.Mockito;
* ignored for value or exception is thrown?
*/
public class KeyValueBinaryViewOperationsTest {
- /**
- * Cluster service.
- */
- private ClusterService clusterService;
-
- /**
- * Creates a table for tests.
- *
- * @return The test table.
- */
- private InternalTable createTable() {
- clusterService = Mockito.mock(ClusterService.class, RETURNS_DEEP_STUBS);
- Mockito.when(clusterService.topologyService().localMember().address())
- .thenReturn(DummyInternalTableImpl.ADDR);
-
- TxManagerImpl txManager = new TxManagerImpl(clusterService, new HeapLockManager());
-
- return new DummyInternalTableImpl(
- new VersionedRowStore(new ConcurrentHashMapPartitionStorage(), txManager), txManager);
- }
-
@Test
public void put() {
SchemaDescriptor schema = new SchemaDescriptor(
@@ -75,8 +59,7 @@ public class KeyValueBinaryViewOperationsTest {
new Column[]{new Column("val", NativeTypes.INT64, false)}
);
- KeyValueView<Tuple, Tuple> tbl =
- new KeyValueBinaryViewImpl(createTable(), new DummySchemaManagerImpl(schema), null, null);
+ KeyValueView<Tuple, Tuple> tbl = createTable(schema).keyValueView();
final Tuple key = Tuple.create().set("id", 1L);
final Tuple val = Tuple.create().set("val", 11L);
@@ -115,8 +98,7 @@ public class KeyValueBinaryViewOperationsTest {
new Column[]{new Column("val", NativeTypes.INT64, false)}
);
- KeyValueView<Tuple, Tuple> tbl =
- new KeyValueBinaryViewImpl(createTable(), new DummySchemaManagerImpl(schema), null, null);
+ KeyValueView<Tuple, Tuple> tbl = createTable(schema).keyValueView();
final Tuple key = Tuple.create().set("id", 1L);
final Tuple val = Tuple.create().set("val", 11L);
@@ -145,8 +127,7 @@ public class KeyValueBinaryViewOperationsTest {
new Column[]{new Column("val", NativeTypes.INT64, false)}
);
- KeyValueView<Tuple, Tuple> tbl =
- new KeyValueBinaryViewImpl(createTable(), new DummySchemaManagerImpl(schema), null, null);
+ KeyValueView<Tuple, Tuple> tbl = createTable(schema).keyValueView();
final Tuple key = Tuple.create().set("id", 1L);
final Tuple val = Tuple.create().set("val", 11L);
@@ -176,8 +157,7 @@ public class KeyValueBinaryViewOperationsTest {
new Column[]{new Column("val", NativeTypes.INT64, false)}
);
- KeyValueView<Tuple, Tuple> tbl =
- new KeyValueBinaryViewImpl(createTable(), new DummySchemaManagerImpl(schema), null, null);
+ KeyValueView<Tuple, Tuple> tbl = createTable(schema).keyValueView();
final Tuple key = Tuple.create().set("id", 1L);
final Tuple val = Tuple.create().set("val", 11L);
@@ -212,8 +192,7 @@ public class KeyValueBinaryViewOperationsTest {
new Column[]{new Column("val", NativeTypes.INT64, false)}
);
- KeyValueView<Tuple, Tuple> tbl =
- new KeyValueBinaryViewImpl(createTable(), new DummySchemaManagerImpl(schema), null, null);
+ KeyValueView<Tuple, Tuple> tbl = createTable(schema).keyValueView();
final Tuple key = Tuple.create().set("id", 1L);
final Tuple key2 = Tuple.create().set("id", 2L);
@@ -252,8 +231,7 @@ public class KeyValueBinaryViewOperationsTest {
new Column[]{new Column("val", NativeTypes.INT64, false)}
);
- final KeyValueView<Tuple, Tuple> tbl =
- new KeyValueBinaryViewImpl(createTable(), new DummySchemaManagerImpl(schema), null, null);
+ final KeyValueView<Tuple, Tuple> tbl = createTable(schema).keyValueView();
final Tuple key = Tuple.create().set("id", 1L);
final Tuple key2 = Tuple.create().set("id", 2L);
@@ -304,8 +282,7 @@ public class KeyValueBinaryViewOperationsTest {
new Column[]{new Column("val", NativeTypes.INT64, false)}
);
- KeyValueView<Tuple, Tuple> tbl =
- new KeyValueBinaryViewImpl(createTable(), new DummySchemaManagerImpl(schema), null, null);
+ KeyValueView<Tuple, Tuple> tbl = createTable(schema).keyValueView();
final Tuple key = Tuple.create().set("id", 1L);
final Tuple key2 = Tuple.create().set("id", 2L);
@@ -339,8 +316,7 @@ public class KeyValueBinaryViewOperationsTest {
new Column[]{new Column("val", NativeTypes.INT64, false)}
);
- KeyValueView<Tuple, Tuple> tbl =
- new KeyValueBinaryViewImpl(createTable(), new DummySchemaManagerImpl(schema), null, null);
+ KeyValueView<Tuple, Tuple> tbl = createTable(schema).keyValueView();
final Tuple key = Tuple.create().set("id", 1L);
final Tuple key2 = Tuple.create().set("id", 2L);
@@ -358,39 +334,55 @@ public class KeyValueBinaryViewOperationsTest {
assertEqualsValues(schema, val2, tbl.get(key));
}
- /**
- * Check key columns equality.
- *
- * @param schema Schema.
- * @param expected Expected tuple.
- * @param actual Actual tuple.
- */
- void assertEqualsKeys(SchemaDescriptor schema, Tuple expected, Tuple actual) {
- int nonNullKey = 0;
+ @Test
+ public void getAll() {
+ SchemaDescriptor schema = new SchemaDescriptor(
+ 1,
+ new Column[]{new Column("id", NativeTypes.INT64, false)},
+ new Column[]{new Column("val", NativeTypes.INT64, false)}
+ );
- for (int i = 0; i < schema.keyColumns().length(); i++) {
- final Column col = schema.keyColumns().column(i);
+ KeyValueView<Tuple, Tuple> tbl = createTable(schema).keyValueView();
- final Object val1 = expected.value(col.name());
- final Object val2 = actual.value(col.name());
+ Tuple key1 = Tuple.create().set("id", 1L);
+ Tuple key2 = Tuple.create().set("id", 2L);
+ Tuple key3 = Tuple.create().set("id", 3L);
- Assertions.assertEquals(val1, val2,
- "Value columns equality check failed: colIdx=" + col.schemaIndex());
+ tbl.putAll(Map.of(
+ key1, Tuple.create().set("val", 11L),
+ key3, Tuple.create().set("val", 33L)
+ ));
- if (schema.isKeyColumn(i) && val1 != null) {
- nonNullKey++;
- }
- }
+ Map<Tuple, Tuple> res = tbl.getAll(List.of(key1, key2, key3));
+
+ assertEquals(2, res.size());
+ assertEquals(Tuple.create().set("val", 11L), res.get(key1));
+ assertEquals(Tuple.create().set("val", 33L), res.get(key3));
+ assertNull(res.get(key2));
+ }
+
+ @NotNull
+ private TableImpl createTable(SchemaDescriptor schema) {
+ ClusterService clusterService = Mockito.mock(ClusterService.class, RETURNS_DEEP_STUBS);
+ Mockito.when(clusterService.topologyService().localMember().address()).thenReturn(DummyInternalTableImpl.ADDR);
+
+ LockManager lockManager = new HeapLockManager();
+
+ TxManager txManager = new TxManagerImpl(clusterService, lockManager);
+
+ DummyInternalTableImpl table = new DummyInternalTableImpl(
+ new VersionedRowStore(new ConcurrentHashMapPartitionStorage(), txManager),
+ txManager);
- assertTrue(nonNullKey > 0, "At least one non-null key column must exist.");
+ return new TableImpl(table, new DummySchemaManagerImpl(schema), null);
}
/**
* Check value columns equality.
*
- * @param schema Schema.
+ * @param schema Schema.
* @param expected Expected tuple.
- * @param actual Actual tuple.
+ * @param actual Actual tuple.
*/
void assertEqualsValues(SchemaDescriptor schema, Tuple expected, Tuple actual) {
for (int i = 0; i < schema.valueColumns().length(); i++) {
@@ -399,7 +391,7 @@ public class KeyValueBinaryViewOperationsTest {
final Object val1 = expected.value(col.name());
final Object val2 = actual.value(col.name());
- Assertions.assertEquals(val1, val2, "Key columns equality check failed: colIdx=" + col.schemaIndex());
+ assertEquals(val1, val2, "Key columns equality check failed: colIdx=" + col.schemaIndex());
}
}
}
diff --git a/modules/table/src/test/java/org/apache/ignite/internal/table/KeyValueViewOperationsSimpleSchemaTest.java b/modules/table/src/test/java/org/apache/ignite/internal/table/KeyValueViewOperationsSimpleSchemaTest.java
index e118a7b..0e7d86c 100644
--- a/modules/table/src/test/java/org/apache/ignite/internal/table/KeyValueViewOperationsSimpleSchemaTest.java
+++ b/modules/table/src/test/java/org/apache/ignite/internal/table/KeyValueViewOperationsSimpleSchemaTest.java
@@ -26,6 +26,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.Answers.RETURNS_DEEP_STUBS;
import java.util.List;
+import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.stream.Collectors;
@@ -44,6 +45,7 @@ import org.apache.ignite.internal.tx.impl.HeapLockManager;
import org.apache.ignite.internal.tx.impl.TxManagerImpl;
import org.apache.ignite.network.ClusterService;
import org.apache.ignite.table.KeyValueView;
+import org.apache.ignite.table.Tuple;
import org.apache.ignite.table.mapper.Mapper;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
@@ -314,6 +316,23 @@ public class KeyValueViewOperationsSimpleSchemaTest {
}
}
+ @Test
+ public void getAll() {
+ KeyValueView<Long, Long> kvView = kvView();
+
+ kvView.putAll(Map.of(
+ 1L, 11L,
+ 3L, 33L
+ ));
+
+ Map<Long, Long> res = kvView.getAll(List.of(1L, 2L, 3L));
+
+ assertEquals(11L, res.get(1L));
+ assertNull(res.get(22L));
+ assertEquals(33L, res.get(3L));
+ }
+
+
/**
* Creates key-value view.
*
diff --git a/modules/table/src/test/java/org/apache/ignite/internal/table/RecordBinaryViewOperationsTest.java b/modules/table/src/test/java/org/apache/ignite/internal/table/RecordBinaryViewOperationsTest.java
index cc7d1cb..b8fbc7c 100644
--- a/modules/table/src/test/java/org/apache/ignite/internal/table/RecordBinaryViewOperationsTest.java
+++ b/modules/table/src/test/java/org/apache/ignite/internal/table/RecordBinaryViewOperationsTest.java
@@ -17,6 +17,7 @@
package org.apache.ignite.internal.table;
+import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
@@ -24,6 +25,8 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.fail;
import static org.mockito.Answers.RETURNS_DEEP_STUBS;
+import java.util.Collection;
+import java.util.List;
import org.apache.ignite.internal.schema.Column;
import org.apache.ignite.internal.schema.InvalidTypeException;
import org.apache.ignite.internal.schema.NativeTypes;
@@ -54,23 +57,6 @@ import org.mockito.Mockito;
* <p>TODO: IGNITE-14486 Add tests for invoke operations. Add tests for bulk operations. Add tests for async operations.
*/
public class RecordBinaryViewOperationsTest {
- /** Cluster service. */
- private ClusterService clusterService;
-
- /**
- * Creates a table for tests.
- *
- * @return The table instance for test.
- */
- private InternalTable createTable() {
- clusterService = Mockito.mock(ClusterService.class, RETURNS_DEEP_STUBS);
- Mockito.when(clusterService.topologyService().localMember().address()).thenReturn(DummyInternalTableImpl.ADDR);
-
- TxManagerImpl txManager = new TxManagerImpl(clusterService, new HeapLockManager());
-
- return new DummyInternalTableImpl(new VersionedRowStore(new ConcurrentHashMapPartitionStorage(), txManager), txManager);
- }
-
@Test
public void insert() {
SchemaDescriptor schema = new SchemaDescriptor(
@@ -349,6 +335,32 @@ public class RecordBinaryViewOperationsTest {
assertEqualsRows(schema, tuple1, tbl.get(keyTuple1));
}
+ @Test
+ public void getAll() {
+ SchemaDescriptor schema = new SchemaDescriptor(
+ 1,
+ new Column[]{new Column("id", NativeTypes.INT64, false)},
+ new Column[]{new Column("val", NativeTypes.INT64, false)}
+ );
+
+ RecordView<Tuple> tbl = createTableImpl(schema).recordView();
+
+ Tuple rec1 = Tuple.create().set("id", 1L).set("val", 11L);
+ Tuple rec3 = Tuple.create().set("id", 3L).set("val", 33L);
+
+ tbl.upsertAll(List.of(rec1, rec3));
+
+ Collection<Tuple> res = tbl.getAll(List.of(Tuple.create().set("id", 1L),
+ Tuple.create().set("id", 2L),
+ Tuple.create().set("id", 3L)
+ ));
+
+ assertEquals(2, res.size());
+ assertTrue(res.contains(rec1));
+ assertTrue(res.contains(rec1));
+ }
+
+
/**
* Check tuples equality.
*