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>