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/11/02 15:37:24 UTC
[ignite-3] 01/02: Extend test coverage.
This is an automated email from the ASF dual-hosted git repository.
amashenkov pushed a commit to branch ignite-15783
in repository https://gitbox.apache.org/repos/asf/ignite-3.git
commit ba0d43facd2630383b8c55253d0b535fbbe5b693
Author: Andrew Mashenkov <an...@gmail.com>
AuthorDate: Tue Nov 2 17:32:04 2021 +0300
Extend test coverage.
---
.../apache/ignite/internal/schema/NativeTypes.java | 2 +
.../internal/schema/marshaller/BinaryMode.java | 18 ++++-
.../internal/schema/marshaller/MarshallerUtil.java | 14 ++++
.../marshaller/reflection/FieldAccessor.java | 52 ++++++++++++
.../org/apache/ignite/internal/schema/RowTest.java | 2 +-
.../{TestUtils.java => SchemaTestUtils.java} | 4 +-
.../schema/marshaller/JavaSerializerTest.java | 8 +-
.../marshaller/reflection/FieldAccessorTest.java | 6 +-
.../schema/registry/UpgradingRowAdapterTest.java | 6 +-
modules/table/pom.xml | 7 ++
...=> KeyValueViewOperationsSimpleSchemaTest.java} | 94 ++++++++++++++++++----
parent/pom.xml | 7 ++
12 files changed, 188 insertions(+), 32 deletions(-)
diff --git a/modules/schema/src/main/java/org/apache/ignite/internal/schema/NativeTypes.java b/modules/schema/src/main/java/org/apache/ignite/internal/schema/NativeTypes.java
index f9f5ff2..0ea4ac9 100644
--- a/modules/schema/src/main/java/org/apache/ignite/internal/schema/NativeTypes.java
+++ b/modules/schema/src/main/java/org/apache/ignite/internal/schema/NativeTypes.java
@@ -21,6 +21,7 @@ import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.BitSet;
import org.apache.ignite.schema.definition.ColumnType;
+import org.jetbrains.annotations.Contract;
/**
* A thin wrapper over {@link NativeTypeSpec} to instantiate parameterized constrained types.
@@ -177,6 +178,7 @@ public class NativeTypes {
* @param val Object to map to native type.
* @return {@code null} for {@code null} value. Otherwise returns NativeType according to the value's type.
*/
+ @Contract("null -> null")
public static NativeType fromObject(Object val) {
NativeTypeSpec spec = NativeTypeSpec.fromObject(val);
diff --git a/modules/schema/src/main/java/org/apache/ignite/internal/schema/marshaller/BinaryMode.java b/modules/schema/src/main/java/org/apache/ignite/internal/schema/marshaller/BinaryMode.java
index f9a2f19..ee7c3e4 100644
--- a/modules/schema/src/main/java/org/apache/ignite/internal/schema/marshaller/BinaryMode.java
+++ b/modules/schema/src/main/java/org/apache/ignite/internal/schema/marshaller/BinaryMode.java
@@ -68,16 +68,28 @@ public enum BinaryMode {
/** Raw byte array. */
BYTE_ARR(NativeTypeSpec.BYTES),
- /** BitSet.*/
+ /** BitSet. */
BITSET(NativeTypeSpec.BITMASK),
/** BigInteger. */
NUMBER(NativeTypeSpec.NUMBER),
/** BigDecimal. */
- DECIMAL(NativeTypeSpec.DECIMAL);
+ DECIMAL(NativeTypeSpec.DECIMAL),
- /** Natove type spec. */
+ /** Date. */
+ DATE(NativeTypeSpec.DATE),
+
+ /** Time. */
+ TIME(NativeTypeSpec.TIME),
+
+ /** Datetime. */
+ DATETIME(NativeTypeSpec.DATETIME),
+
+ /** Timestamp. */
+ TIMESTAMP(NativeTypeSpec.TIMESTAMP);
+
+ /** Native type spec. */
private final NativeTypeSpec typeSpec;
/**
diff --git a/modules/schema/src/main/java/org/apache/ignite/internal/schema/marshaller/MarshallerUtil.java b/modules/schema/src/main/java/org/apache/ignite/internal/schema/marshaller/MarshallerUtil.java
index b9b4d59..6593e4e 100644
--- a/modules/schema/src/main/java/org/apache/ignite/internal/schema/marshaller/MarshallerUtil.java
+++ b/modules/schema/src/main/java/org/apache/ignite/internal/schema/marshaller/MarshallerUtil.java
@@ -19,6 +19,10 @@ package org.apache.ignite.internal.schema.marshaller;
import java.math.BigDecimal;
import java.math.BigInteger;
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
import java.util.BitSet;
import java.util.UUID;
import org.apache.ignite.internal.schema.InvalidTypeException;
@@ -95,6 +99,16 @@ public final class MarshallerUtil {
else if (cls == Double.class)
return BinaryMode.DOUBLE;
+ // Temporal types
+ else if (cls == LocalDate.class)
+ return BinaryMode.DATE;
+ else if (cls == LocalTime.class)
+ return BinaryMode.TIME;
+ else if (cls == LocalDateTime.class)
+ return BinaryMode.DATETIME;
+ else if (cls == Instant.class)
+ return BinaryMode.TIMESTAMP;
+
// Other types
else if (cls == byte[].class)
return BinaryMode.BYTE_ARR;
diff --git a/modules/schema/src/main/java/org/apache/ignite/internal/schema/marshaller/reflection/FieldAccessor.java b/modules/schema/src/main/java/org/apache/ignite/internal/schema/marshaller/reflection/FieldAccessor.java
index 9f638ad..29bf26a 100644
--- a/modules/schema/src/main/java/org/apache/ignite/internal/schema/marshaller/reflection/FieldAccessor.java
+++ b/modules/schema/src/main/java/org/apache/ignite/internal/schema/marshaller/reflection/FieldAccessor.java
@@ -22,6 +22,10 @@ import java.lang.invoke.VarHandle;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.math.BigInteger;
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
import java.util.BitSet;
import java.util.Objects;
import java.util.UUID;
@@ -103,6 +107,10 @@ abstract class FieldAccessor {
case BITSET:
case NUMBER:
case DECIMAL:
+ case TIME:
+ case DATE:
+ case DATETIME:
+ case TIMESTAMP:
return new ReferenceFieldAccessor(varHandle, colIdx, mode);
default:
@@ -147,6 +155,10 @@ abstract class FieldAccessor {
case BITSET:
case NUMBER:
case DECIMAL:
+ case TIME:
+ case DATE:
+ case DATETIME:
+ case TIMESTAMP:
return new IdentityAccessor(colIdx, mode);
default:
@@ -231,6 +243,26 @@ abstract class FieldAccessor {
break;
+ case DATE:
+ val = reader.dateValue(colIdx);
+
+ break;
+
+ case TIME:
+ val = reader.timeValue(colIdx);
+
+ break;
+
+ case TIMESTAMP:
+ val = reader.timestampValue(colIdx);
+
+ break;
+
+ case DATETIME:
+ val = reader.dateTimeValue(colIdx);
+
+ break;
+
default:
assert false : "Invalid mode: " + mode;
}
@@ -315,6 +347,26 @@ abstract class FieldAccessor {
break;
+ case DATE:
+ writer.appendDate((LocalDate)val);
+
+ break;
+
+ case TIME:
+ writer.appendTime((LocalTime)val);
+
+ break;
+
+ case TIMESTAMP:
+ writer.appendTimestamp((Instant)val);
+
+ break;
+
+ case DATETIME:
+ writer.appendDateTime((LocalDateTime)val);
+
+ break;
+
default:
assert false : "Invalid mode: " + mode;
}
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/RowTest.java b/modules/schema/src/test/java/org/apache/ignite/internal/schema/RowTest.java
index 006abe2..4e951a7 100644
--- a/modules/schema/src/test/java/org/apache/ignite/internal/schema/RowTest.java
+++ b/modules/schema/src/test/java/org/apache/ignite/internal/schema/RowTest.java
@@ -466,7 +466,7 @@ public class RowTest {
* @return Random value of requested type.
*/
private Object generateRandomValue(NativeType type) {
- return TestUtils.generateRandomValue(rnd, type);
+ return SchemaTestUtils.generateRandomValue(rnd, type);
}
/**
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/TestUtils.java b/modules/schema/src/test/java/org/apache/ignite/internal/schema/SchemaTestUtils.java
similarity index 98%
rename from modules/schema/src/test/java/org/apache/ignite/internal/schema/TestUtils.java
rename to modules/schema/src/test/java/org/apache/ignite/internal/schema/SchemaTestUtils.java
index ea4f5cf..0da6314 100644
--- a/modules/schema/src/test/java/org/apache/ignite/internal/schema/TestUtils.java
+++ b/modules/schema/src/test/java/org/apache/ignite/internal/schema/SchemaTestUtils.java
@@ -35,7 +35,7 @@ import static org.apache.ignite.internal.schema.row.TemporalTypesHelper.normaliz
/**
* Test utility class.
*/
-public final class TestUtils {
+public final class SchemaTestUtils {
/**
* Generates random value of given type.
*
@@ -118,6 +118,6 @@ public final class TestUtils {
/**
* Stub.
*/
- private TestUtils() {
+ private SchemaTestUtils() {
}
}
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/marshaller/JavaSerializerTest.java b/modules/schema/src/test/java/org/apache/ignite/internal/schema/marshaller/JavaSerializerTest.java
index ac96ea4..ca1f743 100644
--- a/modules/schema/src/test/java/org/apache/ignite/internal/schema/marshaller/JavaSerializerTest.java
+++ b/modules/schema/src/test/java/org/apache/ignite/internal/schema/marshaller/JavaSerializerTest.java
@@ -43,7 +43,7 @@ import org.apache.ignite.internal.schema.NativeType;
import org.apache.ignite.internal.schema.NativeTypeSpec;
import org.apache.ignite.internal.schema.NativeTypes;
import org.apache.ignite.internal.schema.SchemaDescriptor;
-import org.apache.ignite.internal.schema.TestUtils;
+import org.apache.ignite.internal.schema.SchemaTestUtils;
import org.apache.ignite.internal.schema.marshaller.asm.AsmSerializerGenerator;
import org.apache.ignite.internal.schema.marshaller.reflection.JavaSerializerFactory;
import org.apache.ignite.internal.schema.row.Row;
@@ -401,7 +401,7 @@ public class JavaSerializerTest {
* @param type Type.
*/
private Object generateRandomValue(NativeType type) {
- return TestUtils.generateRandomValue(rnd, type);
+ return SchemaTestUtils.generateRandomValue(rnd, type);
}
/**
@@ -477,8 +477,8 @@ public class JavaSerializerTest {
obj.bitmaskCol = IgniteTestUtils.randomBitSet(rnd, 42);
obj.stringCol = IgniteTestUtils.randomString(rnd, rnd.nextInt(255));
obj.bytesCol = IgniteTestUtils.randomBytes(rnd, rnd.nextInt(255));
- obj.numberCol = (BigInteger)TestUtils.generateRandomValue(rnd, NativeTypes.numberOf(12));
- obj.decimalCol = (BigDecimal)TestUtils.generateRandomValue(rnd, NativeTypes.decimalOf(19, 3));
+ obj.numberCol = (BigInteger)SchemaTestUtils.generateRandomValue(rnd, NativeTypes.numberOf(12));
+ obj.decimalCol = (BigDecimal)SchemaTestUtils.generateRandomValue(rnd, NativeTypes.decimalOf(19, 3));
return obj;
}
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/marshaller/reflection/FieldAccessorTest.java b/modules/schema/src/test/java/org/apache/ignite/internal/schema/marshaller/reflection/FieldAccessorTest.java
index 0637fe7..3400d63 100644
--- a/modules/schema/src/test/java/org/apache/ignite/internal/schema/marshaller/reflection/FieldAccessorTest.java
+++ b/modules/schema/src/test/java/org/apache/ignite/internal/schema/marshaller/reflection/FieldAccessorTest.java
@@ -27,7 +27,7 @@ import java.util.Random;
import java.util.UUID;
import org.apache.ignite.internal.schema.Column;
import org.apache.ignite.internal.schema.NativeTypes;
-import org.apache.ignite.internal.schema.TestUtils;
+import org.apache.ignite.internal.schema.SchemaTestUtils;
import org.apache.ignite.internal.schema.marshaller.BinaryMode;
import org.apache.ignite.internal.schema.marshaller.SerializationException;
import org.apache.ignite.internal.schema.row.Row;
@@ -322,8 +322,8 @@ public class FieldAccessorTest {
obj.bitmaskCol = IgniteTestUtils.randomBitSet(rnd, rnd.nextInt(42));
obj.stringCol = IgniteTestUtils.randomString(rnd, rnd.nextInt(255));
obj.bytesCol = IgniteTestUtils.randomBytes(rnd, rnd.nextInt(255));
- obj.numberCol = (BigInteger)TestUtils.generateRandomValue(rnd, NativeTypes.numberOf(12));
- obj.decimalCol = (BigDecimal) TestUtils.generateRandomValue(rnd, NativeTypes.decimalOf(19, 3));
+ obj.numberCol = (BigInteger)SchemaTestUtils.generateRandomValue(rnd, NativeTypes.numberOf(12));
+ obj.decimalCol = (BigDecimal) SchemaTestUtils.generateRandomValue(rnd, NativeTypes.decimalOf(19, 3));
return obj;
}
diff --git a/modules/schema/src/test/java/org/apache/ignite/internal/schema/registry/UpgradingRowAdapterTest.java b/modules/schema/src/test/java/org/apache/ignite/internal/schema/registry/UpgradingRowAdapterTest.java
index f6f880b..91acf5e 100644
--- a/modules/schema/src/test/java/org/apache/ignite/internal/schema/registry/UpgradingRowAdapterTest.java
+++ b/modules/schema/src/test/java/org/apache/ignite/internal/schema/registry/UpgradingRowAdapterTest.java
@@ -33,7 +33,7 @@ import org.apache.ignite.internal.schema.NativeType;
import org.apache.ignite.internal.schema.NativeTypeSpec;
import org.apache.ignite.internal.schema.NativeTypes;
import org.apache.ignite.internal.schema.SchemaDescriptor;
-import org.apache.ignite.internal.schema.TestUtils;
+import org.apache.ignite.internal.schema.SchemaTestUtils;
import org.apache.ignite.internal.schema.mapping.ColumnMapper;
import org.apache.ignite.internal.schema.row.Row;
import org.apache.ignite.internal.schema.row.RowAssembler;
@@ -184,7 +184,7 @@ public class UpgradingRowAdapterTest {
for (int i = 0; i < schema.length(); i++) {
NativeType type = schema.column(i).type();
- res.add(TestUtils.generateRandomValue(rnd, type));
+ res.add(SchemaTestUtils.generateRandomValue(rnd, type));
}
return res;
@@ -195,7 +195,7 @@ public class UpgradingRowAdapterTest {
*
* @param schema Row schema.
* @param vals Row values.
- * @return
+ * @return Serialized row.
*/
private byte[] serializeValuesToRow(SchemaDescriptor schema, List<Object> vals) {
assertEquals(schema.keyColumns().length() + schema.valueColumns().length(), vals.size());
diff --git a/modules/table/pom.xml b/modules/table/pom.xml
index fb4882e..37acb4e 100644
--- a/modules/table/pom.xml
+++ b/modules/table/pom.xml
@@ -165,6 +165,13 @@
<type>test-jar</type>
</dependency>
+ <dependency>
+ <groupId>org.apache.ignite</groupId>
+ <artifactId>ignite-schema</artifactId>
+ <type>test-jar</type>
+ <scope>test</scope>
+ </dependency>
+
<!-- Logging in tests -->
<dependency>
<groupId>org.slf4j</groupId>
diff --git a/modules/table/src/test/java/org/apache/ignite/internal/table/KeyValueOperationsTest.java b/modules/table/src/test/java/org/apache/ignite/internal/table/KeyValueViewOperationsSimpleSchemaTest.java
similarity index 70%
rename from modules/table/src/test/java/org/apache/ignite/internal/table/KeyValueOperationsTest.java
rename to modules/table/src/test/java/org/apache/ignite/internal/table/KeyValueViewOperationsSimpleSchemaTest.java
index 18a9aa8..980aca1 100644
--- a/modules/table/src/test/java/org/apache/ignite/internal/table/KeyValueOperationsTest.java
+++ b/modules/table/src/test/java/org/apache/ignite/internal/table/KeyValueViewOperationsSimpleSchemaTest.java
@@ -17,15 +17,35 @@
package org.apache.ignite.internal.table;
+import java.util.List;
+import java.util.Random;
+import java.util.Set;
+import java.util.stream.Collectors;
import org.apache.ignite.internal.schema.Column;
+import org.apache.ignite.internal.schema.NativeType;
+import org.apache.ignite.internal.schema.NativeTypeSpec;
import org.apache.ignite.internal.schema.NativeTypes;
import org.apache.ignite.internal.schema.SchemaDescriptor;
+import org.apache.ignite.internal.schema.SchemaTestUtils;
import org.apache.ignite.internal.table.impl.DummyInternalTableImpl;
import org.apache.ignite.internal.table.impl.DummySchemaManagerImpl;
import org.apache.ignite.table.KeyValueView;
import org.apache.ignite.table.mapper.Mapper;
import org.junit.jupiter.api.Test;
+import static org.apache.ignite.internal.schema.NativeTypes.BYTES;
+import static org.apache.ignite.internal.schema.NativeTypes.DATE;
+import static org.apache.ignite.internal.schema.NativeTypes.DOUBLE;
+import static org.apache.ignite.internal.schema.NativeTypes.FLOAT;
+import static org.apache.ignite.internal.schema.NativeTypes.INT16;
+import static org.apache.ignite.internal.schema.NativeTypes.INT32;
+import static org.apache.ignite.internal.schema.NativeTypes.INT64;
+import static org.apache.ignite.internal.schema.NativeTypes.INT8;
+import static org.apache.ignite.internal.schema.NativeTypes.STRING;
+import static org.apache.ignite.internal.schema.NativeTypes.datetime;
+import static org.apache.ignite.internal.schema.NativeTypes.time;
+import static org.apache.ignite.internal.schema.NativeTypes.timestamp;
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNull;
@@ -38,28 +58,14 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
* TODO: IGNITE-14487 Add bulk operations tests.
* TODO: IGNITE-14487 Add async operations tests.
*/
-public class KeyValueOperationsTest {
- /** Default mapper. */
- private final Mapper<Long> mapper = new Mapper<>() {
- @Override public Class<Long> getType() {
- return Long.class;
- }
- };
-
- /** Simple schema. */
- private SchemaDescriptor schema = new SchemaDescriptor(
- 1,
- new Column[]{new Column("id", NativeTypes.INT64, false)},
- new Column[]{new Column("val", NativeTypes.INT64, false)}
- );
-
+public class KeyValueViewOperationsSimpleSchemaTest {
/**
* Creates table view.
*
* @return Table KV-view.
*/
private KeyValueView<Long, Long> kvView() {
- return new KeyValueViewImpl<>(new DummyInternalTableImpl(), new DummySchemaManagerImpl(schema), mapper, mapper, null);
+ return kvViewForValueType(NativeTypes.INT64, Long.class);
}
/**
@@ -298,4 +304,60 @@ public class KeyValueOperationsTest {
// Remove non-existed KV pair.
assertTrue(tbl.replace(2L, null, null));
}
+
+ /**
+ *
+ */
+ @Test
+ public void putGetAllTypes() {
+ Random rnd = new Random();
+ Long key = 42L;
+
+ List<NativeType> allTypes = List.of(INT8, INT16, INT32, INT64, FLOAT, DOUBLE, DATE,
+ NativeTypes.numberOf(20), NativeTypes.decimalOf(25, 5),
+ NativeTypes.bitmaskOf(22),
+ time(), datetime(), timestamp(),
+ BYTES, STRING);
+
+ assertEquals(Set.of(NativeTypeSpec.values()), allTypes.stream().map(NativeType::spec).collect(Collectors.toSet()));
+
+ for (NativeType type : allTypes) {
+ final Object val = SchemaTestUtils.generateRandomValue(rnd, type);
+
+ assertFalse(type.mismatch(NativeTypes.fromObject(val)));
+
+ KeyValueViewImpl<Long, Object> kvView = kvViewForValueType(NativeTypes.fromObject(val), (Class<Object>)val.getClass());
+
+ kvView.put(key, val);
+
+ if (val instanceof byte[])
+ assertArrayEquals((byte[])val, (byte[])kvView.get(key));
+ else
+ assertEquals(val, kvView.get(key));
+ }
+ }
+
+ /**
+ * @param type Value column native type.
+ * @param aClass Value class.
+ * @return Key-value view for given value type.
+ */
+ private <T> KeyValueViewImpl<Long, T> kvViewForValueType(NativeType type, Class<T> aClass) {
+ Mapper<Long> keyMapper = () -> Long.class;
+ Mapper<T> valMapper = () -> aClass;
+
+ SchemaDescriptor schema = new SchemaDescriptor(
+ 1,
+ new Column[] {new Column("id", NativeTypes.INT64, false)},
+ new Column[] {new Column("val", type, false)}
+ );
+
+ return new KeyValueViewImpl<>(
+ new DummyInternalTableImpl(),
+ new DummySchemaManagerImpl(schema),
+ keyMapper,
+ valMapper,
+ null
+ );
+ }
}
diff --git a/parent/pom.xml b/parent/pom.xml
index 93969d0..bb3cb2e 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -486,6 +486,13 @@
<dependency>
<groupId>org.apache.ignite</groupId>
+ <artifactId>ignite-schema</artifactId>
+ <version>${project.version}</version>
+ <type>test-jar</type>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.ignite</groupId>
<artifactId>ignite-storage-api</artifactId>
<version>${project.version}</version>
<type>test-jar</type>