diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/DateLayoutTestUtil.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/DateLayoutTestUtil.java index 6ff6c90205e9..56816bf44a3f 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/DateLayoutTestUtil.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/DateLayoutTestUtil.java @@ -30,6 +30,7 @@ import org.neo4j.values.storable.DateValue; import org.neo4j.values.storable.RandomValues; import org.neo4j.values.storable.Value; +import org.neo4j.values.storable.ValueGroup; import org.neo4j.values.storable.Values; public class DateLayoutTestUtil extends LayoutTestUtil @@ -61,6 +62,12 @@ IndexEntryUpdate[] someUpdates() return someUpdatesWithDuplicateValues(); } + @Override + RandomValues.Type[] supportedTypes() + { + return RandomValues.typesOfGroup( ValueGroup.DATE ); + } + @Override int compareIndexedPropertyValue( DateIndexKey key1, DateIndexKey key2 ) { diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/DateTimeLayoutTestUtil.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/DateTimeLayoutTestUtil.java index 05973b0bcc26..310ef5e4e326 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/DateTimeLayoutTestUtil.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/DateTimeLayoutTestUtil.java @@ -31,6 +31,7 @@ import org.neo4j.values.storable.DateTimeValue; import org.neo4j.values.storable.RandomValues; import org.neo4j.values.storable.Value; +import org.neo4j.values.storable.ValueGroup; import org.neo4j.values.storable.Values; import static java.time.ZoneOffset.UTC; @@ -64,6 +65,12 @@ IndexEntryUpdate[] someUpdates() return someUpdatesWithDuplicateValues(); } + @Override + RandomValues.Type[] supportedTypes() + { + return RandomValues.typesOfGroup( ValueGroup.ZONED_DATE_TIME ); + } + @Override int compareIndexedPropertyValue( ZonedDateTimeIndexKey key1, ZonedDateTimeIndexKey key2 ) { diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/DurationLayoutTestUtil.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/DurationLayoutTestUtil.java index 337231aca41b..3f7f50443a3e 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/DurationLayoutTestUtil.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/DurationLayoutTestUtil.java @@ -29,6 +29,7 @@ import org.neo4j.values.storable.DurationValue; import org.neo4j.values.storable.RandomValues; import org.neo4j.values.storable.Value; +import org.neo4j.values.storable.ValueGroup; import org.neo4j.values.storable.Values; public class DurationLayoutTestUtil extends LayoutTestUtil @@ -62,6 +63,12 @@ IndexEntryUpdate[] someUpdates() return someUpdatesWithDuplicateValues(); } + @Override + RandomValues.Type[] supportedTypes() + { + return RandomValues.typesOfGroup( ValueGroup.DURATION ); + } + @Override int compareIndexedPropertyValue( DurationIndexKey key1, DurationIndexKey key2 ) { diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/LayoutTestUtil.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/LayoutTestUtil.java index a09d1f4f9b61..79462858feb0 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/LayoutTestUtil.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/LayoutTestUtil.java @@ -60,6 +60,8 @@ abstract class LayoutTestUtil, VALUE extends Nat abstract IndexEntryUpdate[] someUpdates(); + abstract RandomValues.Type[] supportedTypes(); + protected double fractionDuplicates() { return 0.1; @@ -136,11 +138,18 @@ Value[] extractValuesFromUpdates( IndexEntryUpdate[] updates ) IndexEntryUpdate[] generateAddUpdatesFor( Object[] values ) { - @SuppressWarnings( "unchecked" ) + return generateAddUpdatesFor( Arrays.stream( values ) + .map( Values::of ) + .toArray( Value[]::new ) ); + } + + IndexEntryUpdate[] generateAddUpdatesFor( Value[] values ) + { + //noinspection unchecked IndexEntryUpdate[] indexEntryUpdates = new IndexEntryUpdate[values.length]; for ( int i = 0; i < indexEntryUpdates.length; i++ ) { - indexEntryUpdates[i] = add( i, Values.of( values[i] ) ); + indexEntryUpdates[i] = add( i, values[i] ); } return indexEntryUpdates; } diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/LocalDateTimeLayoutTestUtil.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/LocalDateTimeLayoutTestUtil.java index 49d0a299791a..261b7fd25772 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/LocalDateTimeLayoutTestUtil.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/LocalDateTimeLayoutTestUtil.java @@ -30,6 +30,7 @@ import org.neo4j.values.storable.LocalDateTimeValue; import org.neo4j.values.storable.RandomValues; import org.neo4j.values.storable.Value; +import org.neo4j.values.storable.ValueGroup; import org.neo4j.values.storable.Values; public class LocalDateTimeLayoutTestUtil extends LayoutTestUtil @@ -61,6 +62,12 @@ IndexEntryUpdate[] someUpdates() return someUpdatesWithDuplicateValues(); } + @Override + RandomValues.Type[] supportedTypes() + { + return RandomValues.typesOfGroup( ValueGroup.LOCAL_DATE_TIME ); + } + @Override int compareIndexedPropertyValue( LocalDateTimeIndexKey key1, LocalDateTimeIndexKey key2 ) { diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/LocalTimeLayoutTestUtil.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/LocalTimeLayoutTestUtil.java index 9b1c7f23dea9..1ee8f94d5bd0 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/LocalTimeLayoutTestUtil.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/LocalTimeLayoutTestUtil.java @@ -30,6 +30,7 @@ import org.neo4j.values.storable.LocalTimeValue; import org.neo4j.values.storable.RandomValues; import org.neo4j.values.storable.Value; +import org.neo4j.values.storable.ValueGroup; import org.neo4j.values.storable.Values; public class LocalTimeLayoutTestUtil extends LayoutTestUtil @@ -61,6 +62,12 @@ IndexEntryUpdate[] someUpdates() return someUpdatesWithDuplicateValues(); } + @Override + RandomValues.Type[] supportedTypes() + { + return RandomValues.typesOfGroup( ValueGroup.LOCAL_TIME ); + } + @Override int compareIndexedPropertyValue( LocalTimeIndexKey key1, LocalTimeIndexKey key2 ) { diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NativeIndexAccessorTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NativeIndexAccessorTest.java index bd913d210c05..278a4f56f697 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NativeIndexAccessorTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NativeIndexAccessorTest.java @@ -54,6 +54,7 @@ import org.neo4j.storageengine.api.schema.IndexReader; import org.neo4j.storageengine.api.schema.IndexSample; import org.neo4j.storageengine.api.schema.IndexSampler; +import org.neo4j.values.storable.RandomValues; import org.neo4j.values.storable.Value; import static java.lang.String.format; @@ -83,6 +84,7 @@ public abstract class NativeIndexAccessorTest, VALUE extends NativeIndexValue> extends NativeIndexTestUtil { + private static final int N_VALUES = 10; NativeIndexAccessor accessor; @Rule @@ -135,7 +137,7 @@ public void processMustThrowAfterClose() throws Exception public void shouldIndexAdd() throws Exception { // given - IndexEntryUpdate[] updates = layoutUtil.someUpdates(); + IndexEntryUpdate[] updates = someUpdatesSingleType(); try ( IndexUpdater updater = accessor.newUpdater( ONLINE ) ) { // when @@ -151,7 +153,7 @@ public void shouldIndexAdd() throws Exception public void shouldIndexChange() throws Exception { // given - IndexEntryUpdate[] updates = layoutUtil.someUpdates(); + IndexEntryUpdate[] updates = someUpdatesSingleType(); processAll( updates ); Iterator> generator = filter( skipExisting( updates ), layoutUtil.randomUpdateGenerator( random ) ); @@ -174,7 +176,7 @@ public void shouldIndexChange() throws Exception public void shouldIndexRemove() throws Exception { // given - IndexEntryUpdate[] updates = layoutUtil.someUpdates(); + IndexEntryUpdate[] updates = someUpdatesSingleType(); processAll( updates ); for ( int i = 0; i < updates.length; i++ ) @@ -237,7 +239,7 @@ public void shouldReturnZeroCountForEmptyIndex() public void shouldReturnCountOneForExistingData() throws Exception { // given - IndexEntryUpdate[] updates = layoutUtil.someUpdates(); + IndexEntryUpdate[] updates = someUpdatesSingleType(); processAll( updates ); // when @@ -264,7 +266,7 @@ public void shouldReturnCountOneForExistingData() throws Exception public void shouldReturnCountZeroForMismatchingData() throws Exception { // given - IndexEntryUpdate[] updates = layoutUtil.someUpdates(); + IndexEntryUpdate[] updates = someUpdatesSingleType(); processAll( updates ); // when @@ -288,7 +290,7 @@ public void shouldReturnCountZeroForMismatchingData() throws Exception public void shouldReturnAllEntriesForExistsPredicate() throws Exception { // given - IndexEntryUpdate[] updates = layoutUtil.someUpdates(); + IndexEntryUpdate[] updates = someUpdatesSingleType(); processAll( updates ); // when @@ -315,7 +317,7 @@ public void shouldReturnNoEntriesForExistsPredicateForEmptyIndex() throws Except public void shouldReturnMatchingEntriesForExactPredicate() throws Exception { // given - IndexEntryUpdate[] updates = layoutUtil.someUpdates(); + IndexEntryUpdate[] updates = someUpdatesSingleType(); processAll( updates ); // when @@ -332,7 +334,7 @@ public void shouldReturnMatchingEntriesForExactPredicate() throws Exception public void shouldReturnNoEntriesForMismatchingExactPredicate() throws Exception { // given - IndexEntryUpdate[] updates = layoutUtil.someUpdates(); + IndexEntryUpdate[] updates = someUpdatesSingleType(); processAll( updates ); // when @@ -421,7 +423,12 @@ public void shouldReturnNoEntriesForRangePredicateOutsideAnyMatch() throws Excep public void mustHandleNestedQueries() throws Exception { // given - IndexEntryUpdate[] updates = layoutUtil.someUpdates(); + IndexEntryUpdate[] updates = someUpdatesSingleType(); + mustHandleNestedQueries( updates ); + } + + void mustHandleNestedQueries( IndexEntryUpdate[] updates ) throws IndexEntryConflictException, IndexNotApplicableKernelException + { processAll( updates ); layoutUtil.sort( updates ); @@ -449,7 +456,13 @@ public void mustHandleNestedQueries() throws Exception public void mustHandleMultipleNestedQueries() throws Exception { // given - IndexEntryUpdate[] updates = layoutUtil.someUpdates(); + IndexEntryUpdate[] updates = someUpdatesSingleType(); + mustHandleMultipleNestedQueries( updates ); + } + + void mustHandleMultipleNestedQueries( IndexEntryUpdate[] updates ) + throws IndexEntryConflictException, IndexNotApplicableKernelException + { processAll( updates ); layoutUtil.sort( updates ); @@ -498,7 +511,7 @@ private long entityIdOf( IndexEntryUpdate update ) public void shouldHandleMultipleConsecutiveUpdaters() throws Exception { // given - IndexEntryUpdate[] updates = layoutUtil.someUpdates(); + IndexEntryUpdate[] updates = someUpdatesSingleType(); // when for ( IndexEntryUpdate update : updates ) @@ -545,7 +558,7 @@ public void dropShouldDeleteAndCloseIndex() public void forceShouldCheckpointTree() throws Exception { // given - IndexEntryUpdate[] data = layoutUtil.someUpdates(); + IndexEntryUpdate[] data = someUpdatesSingleType(); processAll( data ); // when @@ -561,7 +574,7 @@ public void forceShouldCheckpointTree() throws Exception public void closeShouldCloseTreeWithoutCheckpoint() throws Exception { // given - IndexEntryUpdate[] data = layoutUtil.someUpdates(); + IndexEntryUpdate[] data = someUpdatesSingleType(); processAll( data ); // when @@ -587,7 +600,7 @@ public void snapshotFilesShouldReturnIndexFile() public void shouldSampleIndex() throws Exception { // given - IndexEntryUpdate[] updates = layoutUtil.someUpdates(); + IndexEntryUpdate[] updates = someUpdatesSingleType(); processAll( updates ); try ( IndexReader reader = accessor.newReader() ) { @@ -659,7 +672,7 @@ public void writingAfterCloseShouldThrow() public void shouldSeeAllEntriesInAllEntriesReader() throws Exception { // given - IndexEntryUpdate[] updates = layoutUtil.someUpdates(); + IndexEntryUpdate[] updates = someUpdatesSingleType(); processAll( updates ); // when @@ -730,7 +743,7 @@ private Value valueOf( IndexEntryUpdate update ) return update.values()[0]; } - private IndexProgressor.NodeValueClient filterClient( final NodeValueIterator iter, final IndexQuery.ExactPredicate filter ) + private IndexProgressor.NodeValueClient filterClient( final NodeValueIterator iter, final IndexQuery filter ) { return new IndexProgressor.NodeValueClient() { @@ -892,7 +905,7 @@ final void processAll( IndexEntryUpdate... updates ) } } - private void forceAndCloseAccessor() throws IOException + private void forceAndCloseAccessor() { accessor.force( IOLimiter.UNLIMITED ); closeAccessor(); @@ -912,6 +925,17 @@ private IndexEntryUpdate simpleUpdate() return IndexEntryUpdate.add( 0, indexDescriptor, of( 0 ) ); } + private IndexEntryUpdate[] someUpdatesSingleType() + { + RandomValues.Type type = randomValues.among( layoutUtil.supportedTypes() ); + Value[] values = new Value[N_VALUES]; + for ( int i = 0; i < N_VALUES; i++ ) + { + values[i] = randomValues.nextValueOfTypes( type ); + } + return layoutUtil.generateAddUpdatesFor( values ); + } + // TODO: multiple query predicates... actually Lucene SimpleIndexReader only supports single predicate // so perhaps we should wait with this until we know exactly how this works and which combinations // that should be supported/optimized for. diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NativeIndexTestUtil.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NativeIndexTestUtil.java index 3a534b2b66aa..803a6ef76acb 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NativeIndexTestUtil.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NativeIndexTestUtil.java @@ -44,6 +44,7 @@ import org.neo4j.test.rule.RandomRule; import org.neo4j.test.rule.TestDirectory; import org.neo4j.test.rule.fs.DefaultFileSystemRule; +import org.neo4j.values.storable.RandomValues; import org.neo4j.values.storable.ValueGroup; import static java.lang.String.format; @@ -73,6 +74,7 @@ public abstract class NativeIndexTestUtil,VALUE private File indexFile; PageCache pageCache; IndexProvider.Monitor monitor = IndexProvider.Monitor.EMPTY; + RandomValues randomValues; @Before public void setup() @@ -82,6 +84,7 @@ public void setup() layout = layoutUtil.createLayout(); indexFile = directory.file( "index" ); pageCache = pageCacheRule.getPageCache( fs ); + randomValues = random.randomValues(); } public File getIndexFile() diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NumberLayoutTestUtil.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NumberLayoutTestUtil.java index 961ced34b53e..fc96a7dc400f 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NumberLayoutTestUtil.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NumberLayoutTestUtil.java @@ -29,6 +29,7 @@ import org.neo4j.values.storable.NumberValue; import org.neo4j.values.storable.RandomValues; import org.neo4j.values.storable.Value; +import org.neo4j.values.storable.ValueGroup; abstract class NumberLayoutTestUtil extends LayoutTestUtil { @@ -59,6 +60,12 @@ abstract class NumberLayoutTestUtil extends LayoutTestUtil { @@ -80,4 +87,44 @@ public void shouldReturnMatchingEntriesForRangePredicateWithInclusiveStartAndExc { // Exclusive is handled via a postfilter for spatial } + + @Override + public void mustHandleNestedQueries() throws IndexEntryConflictException, IndexNotApplicableKernelException + { + // It ok to not use random values here because we are only testing nesting of queries + //noinspection unchecked + IndexEntryUpdate[] updates = layoutUtil.generateAddUpdatesFor( new Value[]{ + Values.pointValue( WGS84, -90, -90 ), + Values.pointValue( WGS84, -70, -70 ), + Values.pointValue( WGS84, -50, -50 ), + Values.pointValue( WGS84, 0, 0 ), + Values.pointValue( WGS84, 50, 50 ), + Values.pointValue( WGS84, 70, 70 ), + Values.pointValue( WGS84, 90, 90 ) + } ); + mustHandleNestedQueries( updates ); + } + + @Override + public void mustHandleMultipleNestedQueries() throws Exception + { + // It ok to not use random values here because we are only testing nesting of queries + //noinspection unchecked + IndexEntryUpdate[] updates = layoutUtil.generateAddUpdatesFor( new Value[]{ + Values.pointValue( WGS84, -90, -90 ), + Values.pointValue( WGS84, -70, -70 ), + Values.pointValue( WGS84, -50, -50 ), + Values.pointValue( WGS84, 0, 0 ), + Values.pointValue( WGS84, 50, 50 ), + Values.pointValue( WGS84, 70, 70 ), + Values.pointValue( WGS84, 90, 90 ) + } ); + mustHandleMultipleNestedQueries( updates ); + } + + @Override + public void shouldReturnNoEntriesForRangePredicateOutsideAnyMatch() throws Exception + { + // Accidental hits outside range is handled via a postfilter for spatial + } } diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/SpatialLayoutTestUtil.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/SpatialLayoutTestUtil.java index 962b09361ac2..27da65192963 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/SpatialLayoutTestUtil.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/SpatialLayoutTestUtil.java @@ -78,6 +78,12 @@ IndexEntryUpdate[] someUpdates() return someUpdatesWithDuplicateValues(); } + @Override + RandomValues.Type[] supportedTypes() + { + return new RandomValues.Type[]{RandomValues.Type.GEOGRAPHIC_POINT}; + } + @Override int compareIndexedPropertyValue( SpatialIndexKey key1, SpatialIndexKey key2 ) { diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/StringLayoutTestUtil.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/StringLayoutTestUtil.java index d51df2b7d92d..9e232f5bed3d 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/StringLayoutTestUtil.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/StringLayoutTestUtil.java @@ -29,6 +29,7 @@ import org.neo4j.values.storable.RandomValues; import org.neo4j.values.storable.TextValue; import org.neo4j.values.storable.Value; +import org.neo4j.values.storable.ValueGroup; import static java.util.Arrays.asList; import static java.util.Arrays.copyOf; @@ -62,6 +63,12 @@ IndexEntryUpdate[] someUpdates() return someUpdatesWithDuplicateValues(); } + @Override + RandomValues.Type[] supportedTypes() + { + return RandomValues.typesOfGroup( ValueGroup.TEXT ); + } + @Override IndexEntryUpdate[] someUpdatesNoDuplicateValues() { diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/TimeLayoutTestUtil.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/TimeLayoutTestUtil.java index ed3ffd748301..8628f004db3b 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/TimeLayoutTestUtil.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/TimeLayoutTestUtil.java @@ -31,6 +31,7 @@ import org.neo4j.values.storable.RandomValues; import org.neo4j.values.storable.TimeValue; import org.neo4j.values.storable.Value; +import org.neo4j.values.storable.ValueGroup; import org.neo4j.values.storable.Values; public class TimeLayoutTestUtil extends LayoutTestUtil @@ -64,6 +65,12 @@ IndexEntryUpdate[] someUpdates() return someUpdatesWithDuplicateValues(); } + @Override + RandomValues.Type[] supportedTypes() + { + return RandomValues.typesOfGroup( ValueGroup.ZONED_TIME ); + } + @Override int compareIndexedPropertyValue( ZonedTimeIndexKey key1, ZonedTimeIndexKey key2 ) { diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/UniqueLayoutTestUtil.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/UniqueLayoutTestUtil.java index c6a0a010f2d1..b34a2af8963c 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/UniqueLayoutTestUtil.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/UniqueLayoutTestUtil.java @@ -50,6 +50,12 @@ IndexEntryUpdate[] someUpdates() return delegate.someUpdatesNoDuplicateValues(); } + @Override + RandomValues.Type[] supportedTypes() + { + return delegate.supportedTypes(); + } + @Override int compareIndexedPropertyValue( KEY key1, KEY key2 ) { diff --git a/community/random-values/src/main/java/org/neo4j/values/storable/RandomValues.java b/community/random-values/src/main/java/org/neo4j/values/storable/RandomValues.java index 0d68627f9a1e..4be047b1ec21 100644 --- a/community/random-values/src/main/java/org/neo4j/values/storable/RandomValues.java +++ b/community/random-values/src/main/java/org/neo4j/values/storable/RandomValues.java @@ -75,7 +75,7 @@ public class RandomValues { public enum Type { - BOOLEAN( ValueGroup.NUMBER, BooleanValue.class ), + BOOLEAN( ValueGroup.BOOLEAN, BooleanValue.class ), BYTE( ValueGroup.NUMBER, ByteValue.class ), SHORT( ValueGroup.NUMBER, ShortValue.class ), INT( ValueGroup.NUMBER, IntValue.class ), @@ -308,6 +308,13 @@ public static Type[] excluding( Type[] among, Type... exclude ) .toArray( Type[]::new ); } + public static Type[] typesOfGroup( ValueGroup valueGroup ) + { + return Arrays.stream( Type.values() ) + .filter( t -> t.valueGroup == valueGroup ) + .toArray( Type[]::new ); + } + /** * Returns the next {@link Value} of provided type. *