From a6d5269b21bd2a5c83167f2340dd8aa6c75d5ff3 Mon Sep 17 00:00:00 2001 From: fickludd Date: Tue, 6 Mar 2018 21:42:13 +0100 Subject: [PATCH] Refactor range predicates to share base class --- .../neo4j/internal/kernel/api/IndexQuery.java | 212 ++++++------------ .../internal/kernel/api/IndexQueryTest.java | 54 +++-- .../neo4j/kernel/impl/api/LookupFilter.java | 4 +- .../api/StateHandlingStatementOperations.java | 77 ++----- .../neo4j/kernel/impl/api/state/TxState.java | 37 ++- .../index/schema/NumberSchemaIndexReader.java | 20 +- .../schema/SpatialSchemaIndexReader.java | 2 +- .../index/schema/StringSchemaIndexReader.java | 20 +- .../index/schema/TemporalIndexReader.java | 1 - .../schema/fusion/FusionIndexReader.java | 79 +++---- .../fusion/SpatialFusionIndexReader.java | 2 +- .../newapi/DefaultNodeValueIndexCursor.java | 54 +---- .../org/neo4j/kernel/impl/newapi/Read.java | 8 +- .../api/txstate/ReadableTransactionState.java | 11 +- .../api/index/inmemory/HashBasedIndex.java | 22 +- .../StateHandlingStatementOperationsTest.java | 21 +- .../schema/NumberSchemaIndexAccessorTest.java | 2 +- .../schema/fusion/FusionIndexReaderTest.java | 10 +- .../fusion/SpatialFusionIndexReaderTest.java | 5 +- .../impl/schema/reader/SimpleIndexReader.java | 25 ++- .../reader/PartitionedIndexReaderTest.java | 4 +- .../org/neo4j/values/storable/Values.java | 30 ++- 22 files changed, 286 insertions(+), 414 deletions(-) diff --git a/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/IndexQuery.java b/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/IndexQuery.java index 566ab1995aec1..a1c9c993b5ffe 100644 --- a/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/IndexQuery.java +++ b/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/IndexQuery.java @@ -25,7 +25,7 @@ import org.apache.commons.lang3.builder.ToStringStyle; import org.neo4j.values.storable.CoordinateReferenceSystem; -import org.neo4j.values.storable.LongValue; +import org.neo4j.values.storable.NumberValue; import org.neo4j.values.storable.PointValue; import org.neo4j.values.storable.TextValue; import org.neo4j.values.storable.Value; @@ -33,6 +33,8 @@ import org.neo4j.values.storable.ValueTuple; import org.neo4j.values.storable.Values; +import static org.neo4j.values.storable.Values.NO_VALUE; + public abstract class IndexQuery { /** @@ -68,10 +70,12 @@ public static ExactPredicate exact( int propertyKeyId, Object value ) * @param toInclusive the upper bound is inclusive if true. * @return an {@link IndexQuery} instance to be used for querying an index. */ - public static NumberRangePredicate range( int propertyKeyId, Number from, boolean fromInclusive, Number to, - boolean toInclusive ) + public static RangePredicate range( int propertyKeyId, Number from, boolean fromInclusive, + Number to, boolean toInclusive ) { - return new NumberRangePredicate( propertyKeyId, from, fromInclusive, to, toInclusive ); + return new NumberRangePredicate( propertyKeyId, + from == null ? null : Values.numberValue( from ), fromInclusive, + to == null ? null : Values.numberValue( to ), toInclusive ); } /** @@ -84,8 +88,8 @@ public static NumberRangePredicate range( int propertyKeyId, Number from, boolea * @param toInclusive the upper bound is inclusive if true. * @return an {@link IndexQuery} instance to be used for querying an index. */ - public static GeometryRangePredicate range( int propertyKeyId, PointValue from, boolean fromInclusive, PointValue to, - boolean toInclusive ) + public static RangePredicate range( int propertyKeyId, PointValue from, boolean fromInclusive, + PointValue to, boolean toInclusive ) { return new GeometryRangePredicate( propertyKeyId, from, fromInclusive, to, toInclusive ); } @@ -100,10 +104,12 @@ public static GeometryRangePredicate range( int propertyKeyId, PointValue from, * @param toInclusive the upper bound is inclusive if true. * @return an {@link IndexQuery} instance to be used for querying an index. */ - public static StringRangePredicate range( int propertyKeyId, String from, boolean fromInclusive, String to, - boolean toInclusive ) + public static RangePredicate range( int propertyKeyId, String from, boolean fromInclusive, + String to, boolean toInclusive ) { - return new StringRangePredicate( propertyKeyId, from, fromInclusive, to, toInclusive ); + return new TextRangePredicate( propertyKeyId, + from == null ? null : Values.stringValue( from ), fromInclusive, + to == null ? null : Values.stringValue( to ), toInclusive ); } /** @@ -204,9 +210,7 @@ public enum IndexQueryType { exists, exact, - rangeString, - rangeNumeric, - rangeGeometric, + range, stringPrefix, stringSuffix, stringContains @@ -228,7 +232,7 @@ public IndexQueryType type() @Override public boolean acceptsValue( Value value ) { - return value != null && value != Values.NO_VALUE; + return value != null && value != NO_VALUE; } @Override @@ -278,38 +282,42 @@ public Value value() } } - public static final class NumberRangePredicate extends IndexQuery + public static class RangePredicate extends IndexQuery { - private final Value from; - private final boolean fromInclusive; - private final Value to; - private final boolean toInclusive; + protected final T from; + protected final boolean fromInclusive; + protected final T to; + protected final boolean toInclusive; + protected final ValueGroup valueGroup; - NumberRangePredicate( int propertyKeyId, Number from, boolean fromInclusive, Number to, boolean toInclusive ) + RangePredicate( int propertyKeyId, ValueGroup valueGroup, + T from, boolean fromInclusive, + T to, boolean toInclusive ) { super( propertyKeyId ); - this.from = Values.numberValue( from ); + this.valueGroup = valueGroup; + this.from = from; this.fromInclusive = fromInclusive; - this.to = Values.numberValue( to ); + this.to = to; this.toInclusive = toInclusive; } @Override public IndexQueryType type() { - return IndexQueryType.rangeNumeric; + return IndexQueryType.range; } @Override public boolean acceptsValue( Value value ) { - if ( value == null ) + if ( value == null || value == NO_VALUE ) { return false; } - if ( Values.isNumberValue( value ) ) + if ( value.valueGroup() == valueGroup ) { - if ( from != Values.NO_VALUE ) + if ( from != NO_VALUE ) { int compare = Values.COMPARATOR.compare( value, from ); if ( compare < 0 || !fromInclusive && compare == 0 ) @@ -317,7 +325,7 @@ public boolean acceptsValue( Value value ) return false; } } - if ( to != Values.NO_VALUE ) + if ( to != NO_VALUE ) { int compare = Values.COMPARATOR.compare( value, to ); if ( compare > 0 || !toInclusive && compare == 0 ) @@ -333,27 +341,17 @@ public boolean acceptsValue( Value value ) @Override public ValueGroup valueGroup() { - return ValueGroup.NUMBER; + return valueGroup; } - public Number from() + public Value fromValue() { - return (Number)from.asObject(); - } - - public Number to() - { - return (Number)to.asObject(); - } - - public Value fromAsValue() - { - return from; + return from == null ? NO_VALUE : from; } - public Value toAsValue() + public Value toValue() { - return to; + return to == null ? NO_VALUE : to; } public boolean fromInclusive() @@ -367,34 +365,20 @@ public boolean toInclusive() } } - public static final class GeometryRangePredicate extends IndexQuery + public static final class GeometryRangePredicate extends RangePredicate { - private final PointValue from; - private final boolean fromInclusive; - private final PointValue to; - private final boolean toInclusive; private final CoordinateReferenceSystem crs; GeometryRangePredicate( int propertyKeyId, PointValue from, boolean fromInclusive, PointValue to, boolean toInclusive ) { - super( propertyKeyId ); + super( propertyKeyId, ValueGroup.GEOMETRY, from, fromInclusive, to, toInclusive ); if ( from == null && to == null ) { throw new IllegalArgumentException( "Cannot create GeometryRangePredicate without at least one bound" ); } - this.from = from; - this.fromInclusive = fromInclusive; - this.to = to; - this.toInclusive = toInclusive; this.crs = from != null ? from.getCoordinateReferenceSystem() : to.getCoordinateReferenceSystem(); } - @Override - public IndexQueryType type() - { - return IndexQueryType.rangeGeometric; - } - @Override public boolean acceptsValue( Value value ) { @@ -402,7 +386,6 @@ public boolean acceptsValue( Value value ) { return false; } - //TODO Deal with other Geometries if ( value instanceof PointValue ) { PointValue point = (PointValue) value; @@ -411,10 +394,9 @@ public boolean acceptsValue( Value value ) return false; } - @Override - public ValueGroup valueGroup() + public CoordinateReferenceSystem crs() { - return ValueGroup.GEOMETRY; + return crs; } public PointValue from() @@ -426,117 +408,57 @@ public PointValue to() { return to; } - - public CoordinateReferenceSystem crs() - { - return crs; - } - - public boolean fromInclusive() - { - return fromInclusive; - } - - public boolean toInclusive() - { - return toInclusive; - } } - public abstract static class StringPredicate extends IndexQuery + public static final class NumberRangePredicate extends RangePredicate { - StringPredicate( int propertyKeyId ) - { - super( propertyKeyId ); - } - - @Override - public ValueGroup valueGroup() + NumberRangePredicate( int propertyKeyId, NumberValue from, boolean fromInclusive, NumberValue to, + boolean toInclusive ) { - return ValueGroup.TEXT; + super( propertyKeyId, ValueGroup.NUMBER, from, fromInclusive, to, toInclusive ); } - } - - public static final class StringRangePredicate extends StringPredicate - { - private final Value from; - private final boolean fromInclusive; - private final Value to; - private final boolean toInclusive; - StringRangePredicate( int propertyKeyId, String from, boolean fromInclusive, String to, boolean toInclusive ) + public Number from() { - super( propertyKeyId ); - this.from = Values.stringOrNoValue( from ); - this.fromInclusive = fromInclusive; - this.to = Values.stringOrNoValue( to ); - this.toInclusive = toInclusive; + return from == null ? null : from.asObject(); } - @Override - public IndexQueryType type() + public Number to() { - return IndexQueryType.rangeString; + return to == null ? null : to.asObject(); } + } - @Override - public boolean acceptsValue( Value value ) + public static final class TextRangePredicate extends RangePredicate + { + TextRangePredicate( int propertyKeyId, TextValue from, boolean fromInclusive, TextValue to, + boolean toInclusive ) { - if ( value == null ) - { - return false; - } - if ( !Values.isTextValue( value ) ) - { - return false; - } - if ( from != Values.NO_VALUE ) - { - int compare = Values.COMPARATOR.compare( value, from ); - if ( compare < 0 || !fromInclusive && compare == 0 ) - { - return false; - } - } - if ( to != Values.NO_VALUE ) - { - int compare = Values.COMPARATOR.compare( value, to ); - if ( compare > 0 || !toInclusive && compare == 0 ) - { - return false; - } - } - return true; + super( propertyKeyId, ValueGroup.TEXT, from, fromInclusive, to, toInclusive ); } public String from() { - return (String)from.asObject(); - } - - public Value fromAsValue() - { - return from; - } - - public boolean fromInclusive() - { - return fromInclusive; + return from == null ? null : from.stringValue(); } public String to() { - return (String)to.asObject(); + return to == null ? null : to.stringValue(); } + } - public Value toAsValue() + public abstract static class StringPredicate extends IndexQuery + { + StringPredicate( int propertyKeyId ) { - return to; + super( propertyKeyId ); } - public boolean toInclusive() + @Override + public ValueGroup valueGroup() { - return toInclusive; + return ValueGroup.TEXT; } } diff --git a/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/IndexQueryTest.java b/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/IndexQueryTest.java index a90cc7e4b0054..aa645b0272788 100644 --- a/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/IndexQueryTest.java +++ b/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/IndexQueryTest.java @@ -23,11 +23,9 @@ import org.neo4j.internal.kernel.api.IndexQuery.ExactPredicate; import org.neo4j.internal.kernel.api.IndexQuery.ExistsPredicate; -import org.neo4j.internal.kernel.api.IndexQuery.NumberRangePredicate; +import org.neo4j.internal.kernel.api.IndexQuery.RangePredicate; import org.neo4j.internal.kernel.api.IndexQuery.StringContainsPredicate; import org.neo4j.internal.kernel.api.IndexQuery.StringPrefixPredicate; -import org.neo4j.internal.kernel.api.IndexQuery.StringRangePredicate; -import org.neo4j.internal.kernel.api.IndexQuery.GeometryRangePredicate; import org.neo4j.internal.kernel.api.IndexQuery.StringSuffixPredicate; import org.neo4j.values.storable.CoordinateReferenceSystem; import org.neo4j.values.storable.PointValue; @@ -92,7 +90,7 @@ public void testExact_ComparingBigDoublesAndLongs() @Test public void testNumRange_FalseForIrrelevant() { - NumberRangePredicate p = IndexQuery.range( propId, 11, true, 13, true ); + RangePredicate p = IndexQuery.range( propId, 11, true, 13, true ); assertFalseForOtherThings( p ); } @@ -100,7 +98,7 @@ public void testNumRange_FalseForIrrelevant() @Test public void testNumRange_InclusiveLowerInclusiveUpper() { - NumberRangePredicate p = IndexQuery.range( propId, 11, true, 13, true ); + RangePredicate p = IndexQuery.range( propId, 11, true, 13, true ); assertFalse( test( p, 10 ) ); assertTrue( test( p, 11 ) ); @@ -112,7 +110,7 @@ public void testNumRange_InclusiveLowerInclusiveUpper() @Test public void testNumRange_ExclusiveLowerExclusiveLower() { - NumberRangePredicate p = IndexQuery.range( propId, 11, false, 13, false ); + RangePredicate p = IndexQuery.range( propId, 11, false, 13, false ); assertFalse( test( p, 11 ) ); assertTrue( test( p, 12 ) ); @@ -122,7 +120,7 @@ public void testNumRange_ExclusiveLowerExclusiveLower() @Test public void testNumRange_InclusiveLowerExclusiveUpper() { - NumberRangePredicate p = IndexQuery.range( propId, 11, true, 13, false ); + RangePredicate p = IndexQuery.range( propId, 11, true, 13, false ); assertFalse( test( p, 10 ) ); assertTrue( test( p, 11 ) ); @@ -133,7 +131,7 @@ public void testNumRange_InclusiveLowerExclusiveUpper() @Test public void testNumRange_ExclusiveLowerInclusiveUpper() { - NumberRangePredicate p = IndexQuery.range( propId, 11, false, 13, true ); + RangePredicate p = IndexQuery.range( propId, 11, false, 13, true ); assertFalse( test( p, 11 ) ); assertTrue( test( p, 12 ) ); @@ -144,7 +142,7 @@ public void testNumRange_ExclusiveLowerInclusiveUpper() @Test public void testNumRange_LowerNullValue() { - NumberRangePredicate p = IndexQuery.range( propId, null, true, 13, true ); + RangePredicate p = IndexQuery.range( propId, null, true, 13, true ); assertTrue( test( p, 10 ) ); assertTrue( test( p, 11 ) ); @@ -156,7 +154,7 @@ public void testNumRange_LowerNullValue() @Test public void testNumRange_UpperNullValue() { - NumberRangePredicate p = IndexQuery.range( propId, 11, true, null, true ); + RangePredicate p = IndexQuery.range( propId, 11, true, null, true ); assertFalse( test( p, 10 ) ); assertTrue( test( p, 11 ) ); @@ -168,7 +166,7 @@ public void testNumRange_UpperNullValue() @Test public void testNumRange_ComparingBigDoublesAndLongs() { - NumberRangePredicate p = IndexQuery.range( propId, 9007199254740993L, true, null, true ); + RangePredicate p = IndexQuery.range( propId, 9007199254740993L, true, null, true ); assertFalse( test( p, 9007199254740992D ) ); } @@ -178,7 +176,7 @@ public void testNumRange_ComparingBigDoublesAndLongs() @Test public void testStringRange_FalseForIrrelevant() { - StringRangePredicate p = IndexQuery.range( propId, "bbb", true, "bee", true ); + RangePredicate p = IndexQuery.range( propId, "bbb", true, "bee", true ); assertFalseForOtherThings( p ); } @@ -186,7 +184,7 @@ public void testStringRange_FalseForIrrelevant() @Test public void testStringRange_InclusiveLowerInclusiveUpper() { - StringRangePredicate p = IndexQuery.range( propId, "bbb", true, "bee", true ); + RangePredicate p = IndexQuery.range( propId, "bbb", true, "bee", true ); assertFalse( test( p, "bba" ) ); assertTrue( test( p, "bbb" ) ); @@ -198,7 +196,7 @@ public void testStringRange_InclusiveLowerInclusiveUpper() @Test public void testStringRange_ExclusiveLowerInclusiveUpper() { - StringRangePredicate p = IndexQuery.range( propId, "bbb", false, "bee", true ); + RangePredicate p = IndexQuery.range( propId, "bbb", false, "bee", true ); assertFalse( test( p, "bbb" ) ); assertTrue( test( p, "bbba" ) ); @@ -209,7 +207,7 @@ public void testStringRange_ExclusiveLowerInclusiveUpper() @Test public void testStringRange_InclusiveLowerExclusiveUpper() { - StringRangePredicate p = IndexQuery.range( propId, "bbb", true, "bee", false ); + RangePredicate p = IndexQuery.range( propId, "bbb", true, "bee", false ); assertFalse( test( p, "bba" ) ); assertTrue( test( p, "bbb" ) ); @@ -220,7 +218,7 @@ public void testStringRange_InclusiveLowerExclusiveUpper() @Test public void testStringRange_ExclusiveLowerExclusiveUpper() { - StringRangePredicate p = IndexQuery.range( propId, "bbb", false, "bee", false ); + RangePredicate p = IndexQuery.range( propId, "bbb", false, "bee", false ); assertFalse( test( p, "bbb" ) ); assertTrue( test( p, "bbba" ) ); @@ -231,7 +229,7 @@ public void testStringRange_ExclusiveLowerExclusiveUpper() @Test public void testStringRange_UpperUnbounded() { - StringRangePredicate p = IndexQuery.range( propId, "bbb", false, null, false ); + RangePredicate p = IndexQuery.range( propId, "bbb", false, null, false ); assertFalse( test( p, "bbb" ) ); assertTrue( test( p, "bbba" ) ); @@ -241,7 +239,7 @@ public void testStringRange_UpperUnbounded() @Test public void testStringRange_LowerUnbounded() { - StringRangePredicate p = IndexQuery.range( propId, null, false, "bee", false ); + RangePredicate p = IndexQuery.range( propId, null, false, "bee", false ); assertTrue( test( p, "" ) ); assertTrue( test( p, "bed" ) ); @@ -269,7 +267,7 @@ public void testStringRange_LowerUnbounded() @Test public void testGeometryRange_FalseForIrrelevant() { - GeometryRangePredicate p = IndexQuery.range( propId, gps2, true, gps5, true ); + RangePredicate p = IndexQuery.range( propId, gps2, true, gps5, true ); assertFalseForOtherThings( p ); } @@ -277,7 +275,7 @@ public void testGeometryRange_FalseForIrrelevant() @Test public void testGeometryRange_InclusiveLowerInclusiveUpper() { - GeometryRangePredicate p = IndexQuery.range( propId, gps2, true, gps5, true ); + RangePredicate p = IndexQuery.range( propId, gps2, true, gps5, true ); assertFalse( test( p, gps1 ) ); assertTrue( test( p, gps2 ) ); @@ -293,7 +291,7 @@ public void testGeometryRange_InclusiveLowerInclusiveUpper() @Test public void testGeometryRange_ExclusiveLowerInclusiveUpper() { - GeometryRangePredicate p = IndexQuery.range( propId, gps2, false, gps5, true ); + RangePredicate p = IndexQuery.range( propId, gps2, false, gps5, true ); assertFalse( test( p, gps2 ) ); assertTrue( test( p, gps3 ) ); @@ -308,7 +306,7 @@ public void testGeometryRange_ExclusiveLowerInclusiveUpper() @Test public void testGeometryRange_InclusiveLowerExclusiveUpper() { - GeometryRangePredicate p = IndexQuery.range( propId, gps2, true, gps5, false ); + RangePredicate p = IndexQuery.range( propId, gps2, true, gps5, false ); assertFalse( test( p, gps1 ) ); assertTrue( test( p, gps2 ) ); @@ -323,7 +321,7 @@ public void testGeometryRange_InclusiveLowerExclusiveUpper() @Test public void testGeometryRange_ExclusiveLowerExclusiveUpper() { - GeometryRangePredicate p = IndexQuery.range( propId, gps2, false, gps5, false ); + RangePredicate p = IndexQuery.range( propId, gps2, false, gps5, false ); assertFalse( test( p, gps2 ) ); assertTrue( test( p, gps3 ) ); @@ -338,7 +336,7 @@ public void testGeometryRange_ExclusiveLowerExclusiveUpper() @Test public void testGeometryRange_UpperUnbounded() { - GeometryRangePredicate p = IndexQuery.range( propId, gps2, false, null, false ); + RangePredicate p = IndexQuery.range( propId, gps2, false, null, false ); assertFalse( test( p, gps2 ) ); assertTrue( test( p, gps3 ) ); @@ -352,7 +350,7 @@ public void testGeometryRange_UpperUnbounded() @Test public void testGeometryRange_LowerUnbounded() { - GeometryRangePredicate p = IndexQuery.range( propId, null, false, gps5, false ); + RangePredicate p = IndexQuery.range( propId, null, false, gps5, false ); assertTrue( test( p, gps1 ) ); assertTrue( test( p, gps3 ) ); @@ -366,7 +364,7 @@ public void testGeometryRange_LowerUnbounded() @Test public void testGeometryRange_Cartesian() { - GeometryRangePredicate p = IndexQuery.range( propId, car1, false, car2, true ); + RangePredicate p = IndexQuery.range( propId, car1, false, car2, true ); assertFalse( test( p, gps1 ) ); assertFalse( test( p, gps3 ) ); @@ -382,7 +380,7 @@ public void testGeometryRange_Cartesian() @Test public void testGeometryRange_Cartesian3D() { - GeometryRangePredicate p = IndexQuery.range( propId, car3, true, car4, true ); + RangePredicate p = IndexQuery.range( propId, car3, true, car4, true ); assertFalse( test( p, gps1 ) ); assertFalse( test( p, gps3 ) ); @@ -398,7 +396,7 @@ public void testGeometryRange_Cartesian3D() @Test public void testGeometryRange_WGS84_3D() { - GeometryRangePredicate p = IndexQuery.range( propId, gps1_3d, true, gps2_3d, true ); + RangePredicate p = IndexQuery.range( propId, gps1_3d, true, gps2_3d, true ); assertFalse( test( p, gps1 ) ); assertFalse( test( p, gps3 ) ); diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/LookupFilter.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/LookupFilter.java index 75cbcf69f1950..8c8ffdb014ca4 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/LookupFilter.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/LookupFilter.java @@ -32,6 +32,7 @@ import org.neo4j.kernel.impl.api.operations.EntityOperations; import org.neo4j.storageengine.api.NodeItem; import org.neo4j.values.storable.Value; +import org.neo4j.values.storable.ValueGroup; import org.neo4j.values.storable.Values; /** @@ -155,7 +156,8 @@ private static boolean isNumericOrGeometricPredicate( IndexQuery predicate ) return true; } } - else if ( predicate.type() == IndexQuery.IndexQueryType.rangeNumeric || predicate.type() == IndexQuery.IndexQueryType.rangeGeometric ) + else if ( predicate.type() == IndexQuery.IndexQueryType.range && + ( predicate.valueGroup() == ValueGroup.NUMBER || predicate.valueGroup() == ValueGroup.GEOMETRY ) ) { return true; } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/StateHandlingStatementOperations.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/StateHandlingStatementOperations.java index 111537b6e40cd..744f6fb4d7799 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/StateHandlingStatementOperations.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/StateHandlingStatementOperations.java @@ -98,8 +98,8 @@ import org.neo4j.storageengine.api.txstate.NodeState; import org.neo4j.storageengine.api.txstate.PrimitiveLongReadableDiffSets; import org.neo4j.storageengine.api.txstate.ReadableDiffSets; -import org.neo4j.values.storable.PointValue; import org.neo4j.values.storable.Value; +import org.neo4j.values.storable.ValueGroup; import org.neo4j.values.storable.ValueTuple; import org.neo4j.values.storable.Values; @@ -866,27 +866,14 @@ public PrimitiveLongResourceIterator indexQuery( KernelStatement state, SchemaIn case exists: return filterIndexStateChangesForScan( state, exactMatches, index ); - case rangeNumeric: + case range: assertSinglePredicate( predicates ); - IndexQuery.NumberRangePredicate numPred = (IndexQuery.NumberRangePredicate) firstPredicate; - return filterIndexStateChangesForRangeSeekByNumber( state, index, numPred.from(), - numPred.fromInclusive(), numPred.to(), numPred.toInclusive(), exactMatches ); + IndexQuery.RangePredicate rangePred = (IndexQuery.RangePredicate) firstPredicate; + return filterIndexStateChangesForRangeSeek( state, index, rangePred.valueGroup(), + rangePred.fromValue(), rangePred.fromInclusive(), + rangePred.toValue(), rangePred.toInclusive(), + exactMatches ); - case rangeGeometric: - assertSinglePredicate( predicates ); - IndexQuery.GeometryRangePredicate geomPred = (IndexQuery.GeometryRangePredicate) firstPredicate; - return filterIndexStateChangesForRangeSeekByGeometry( - state, index, geomPred.from(), geomPred.fromInclusive(), geomPred.to(), - geomPred.toInclusive(), exactMatches ); - - case rangeString: - { - assertSinglePredicate( predicates ); - IndexQuery.StringRangePredicate strPred = (IndexQuery.StringRangePredicate) firstPredicate; - return filterIndexStateChangesForRangeSeekByString( - state, index, strPred.from(), strPred.fromInclusive(), strPred.to(), - strPred.toInclusive(), committed ); - } case stringPrefix: { assertSinglePredicate( predicates ); @@ -972,55 +959,17 @@ private PrimitiveLongResourceIterator filterIndexStateChangesForSeek( return nodeIds; } - private PrimitiveLongResourceIterator filterIndexStateChangesForRangeSeekByNumber( KernelStatement state, - SchemaIndexDescriptor index, - Number lower, boolean includeLower, - Number upper, boolean includeUpper, - PrimitiveLongResourceIterator nodeIds ) - { - if ( state.hasTxStateWithChanges() ) - { - TransactionState txState = state.txState(); - PrimitiveLongReadableDiffSets labelPropertyChangesForNumber = - txState.indexUpdatesForRangeSeekByNumber( index, lower, includeLower, upper, includeUpper ); - ReadableDiffSets nodes = txState.addedAndRemovedNodes(); - - // Apply to actual index lookup - return nodes.augmentWithRemovals( labelPropertyChangesForNumber.augment( nodeIds ) ); - } - return nodeIds; - } - - private PrimitiveLongResourceIterator filterIndexStateChangesForRangeSeekByGeometry( KernelStatement state, - SchemaIndexDescriptor index, - PointValue lower, boolean includeLower, - PointValue upper, boolean includeUpper, - PrimitiveLongResourceIterator nodeIds ) - { - if ( state.hasTxStateWithChanges() ) - { - TransactionState txState = state.txState(); - PrimitiveLongReadableDiffSets labelPropertyChangesForGeometry = - txState.indexUpdatesForRangeSeekByGeometry( index, lower, includeLower, upper, includeUpper ); - ReadableDiffSets nodes = txState.addedAndRemovedNodes(); - - // Apply to actual index lookup - return nodes.augmentWithRemovals( labelPropertyChangesForGeometry.augment( nodeIds ) ); - } - return nodeIds; - } - - private PrimitiveLongResourceIterator filterIndexStateChangesForRangeSeekByString( KernelStatement state, - SchemaIndexDescriptor index, - String lower, boolean includeLower, - String upper, boolean includeUpper, + private PrimitiveLongResourceIterator filterIndexStateChangesForRangeSeek( KernelStatement state, + SchemaIndexDescriptor index, ValueGroup valueGroup, + Value lower, boolean includeLower, + Value upper, boolean includeUpper, PrimitiveLongResourceIterator nodeIds ) { if ( state.hasTxStateWithChanges() ) { TransactionState txState = state.txState(); - PrimitiveLongReadableDiffSets labelPropertyChangesForString = txState.indexUpdatesForRangeSeekByString( - index, lower, includeLower, upper, includeUpper ); + PrimitiveLongReadableDiffSets labelPropertyChangesForString = txState.indexUpdatesForRangeSeek( + index, valueGroup, lower, includeLower, upper, includeUpper ); ReadableDiffSets nodes = txState.addedAndRemovedNodes(); // Apply to actual index lookup diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/TxState.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/TxState.java index 79ca6a54aeddd..76169dd9230b5 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/TxState.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/TxState.java @@ -74,9 +74,9 @@ import org.neo4j.storageengine.api.txstate.ReadableTransactionState; import org.neo4j.storageengine.api.txstate.RelationshipState; import org.neo4j.storageengine.api.txstate.TxStateVisitor; -import org.neo4j.values.storable.PointValue; import org.neo4j.values.storable.TextValue; import org.neo4j.values.storable.Value; +import org.neo4j.values.storable.ValueGroup; import org.neo4j.values.storable.ValueTuple; import org.neo4j.values.storable.Values; @@ -1063,9 +1063,9 @@ public PrimitiveLongReadableDiffSets indexUpdatesForRangeSeekByNumber( SchemaInd } @Override - public PrimitiveLongReadableDiffSets indexUpdatesForRangeSeekByGeometry( SchemaIndexDescriptor descriptor, - PointValue lower, boolean includeLower, - PointValue upper, boolean includeUpper ) + public PrimitiveLongReadableDiffSets indexUpdatesForRangeSeekByString( SchemaIndexDescriptor descriptor, + String lower, boolean includeLower, + String upper, boolean includeUpper ) { TreeMap sortedUpdates = getSortedIndexUpdates( descriptor.schema() ); if ( sortedUpdates == null ) @@ -1073,11 +1073,6 @@ public PrimitiveLongReadableDiffSets indexUpdatesForRangeSeekByGeometry( SchemaI return PrimitiveLongReadableDiffSets.EMPTY; } - if ( lower == null && upper == null ) - { - throw new IllegalArgumentException( "Cannot access TxState with invalid GeometryRangePredicate" ); - } - ValueTuple selectedLower; boolean selectedIncludeLower; @@ -1086,23 +1081,23 @@ public PrimitiveLongReadableDiffSets indexUpdatesForRangeSeekByGeometry( SchemaI if ( lower == null ) { - selectedLower = ValueTuple.of( Values.minPointValue( upper ) ); + selectedLower = ValueTuple.of( Values.MIN_STRING ); selectedIncludeLower = true; } else { - selectedLower = ValueTuple.of( lower ); + selectedLower = ValueTuple.of( Values.stringValue( lower ) ); selectedIncludeLower = includeLower; } if ( upper == null ) { - selectedUpper = ValueTuple.of( Values.maxPointValue( lower ) ); - selectedIncludeUpper = true; + selectedUpper = ValueTuple.of( Values.MAX_STRING ); + selectedIncludeUpper = false; } else { - selectedUpper = ValueTuple.of( upper ); + selectedUpper = ValueTuple.of( Values.stringValue( upper ) ); selectedIncludeUpper = includeUpper; } @@ -1110,9 +1105,9 @@ public PrimitiveLongReadableDiffSets indexUpdatesForRangeSeekByGeometry( SchemaI } @Override - public PrimitiveLongReadableDiffSets indexUpdatesForRangeSeekByString( SchemaIndexDescriptor descriptor, - String lower, boolean includeLower, - String upper, boolean includeUpper ) + public PrimitiveLongReadableDiffSets indexUpdatesForRangeSeek( SchemaIndexDescriptor descriptor, ValueGroup valueGroup, + Value lower, boolean includeLower, + Value upper, boolean includeUpper ) { TreeMap sortedUpdates = getSortedIndexUpdates( descriptor.schema() ); if ( sortedUpdates == null ) @@ -1128,23 +1123,23 @@ public PrimitiveLongReadableDiffSets indexUpdatesForRangeSeekByString( SchemaInd if ( lower == null ) { - selectedLower = ValueTuple.of( Values.MIN_STRING ); + selectedLower = ValueTuple.of( Values.minValue( valueGroup, upper ) ); selectedIncludeLower = true; } else { - selectedLower = ValueTuple.of( Values.stringValue( lower ) ); + selectedLower = ValueTuple.of( lower ); selectedIncludeLower = includeLower; } if ( upper == null ) { - selectedUpper = ValueTuple.of( Values.MAX_STRING ); + selectedUpper = ValueTuple.of( Values.maxValue( valueGroup, lower ) ); selectedIncludeUpper = false; } else { - selectedUpper = ValueTuple.of( Values.stringValue( upper ) ); + selectedUpper = ValueTuple.of( upper ); selectedIncludeUpper = includeUpper; } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NumberSchemaIndexReader.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NumberSchemaIndexReader.java index 73ffd921fcd46..f03cdf4657095 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NumberSchemaIndexReader.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NumberSchemaIndexReader.java @@ -24,11 +24,11 @@ import org.neo4j.internal.kernel.api.IndexOrder; import org.neo4j.internal.kernel.api.IndexQuery; import org.neo4j.internal.kernel.api.IndexQuery.ExactPredicate; -import org.neo4j.internal.kernel.api.IndexQuery.NumberRangePredicate; +import org.neo4j.internal.kernel.api.IndexQuery.RangePredicate; import org.neo4j.kernel.api.schema.index.SchemaIndexDescriptor; import org.neo4j.kernel.impl.api.index.sampling.IndexSamplingConfig; import org.neo4j.values.storable.Value; -import org.neo4j.values.storable.ValueGroup; +import org.neo4j.values.storable.Values; class NumberSchemaIndexReader extends NativeSchemaIndexReader { @@ -63,8 +63,8 @@ boolean initializeRangeForQuery( KEY treeKeyFrom, KEY treeKeyTo, IndexQuery[] pr treeKeyFrom.from( Long.MIN_VALUE, exactPredicate.value() ); treeKeyTo.from( Long.MAX_VALUE, exactPredicate.value() ); break; - case rangeNumeric: - NumberRangePredicate rangePredicate = (NumberRangePredicate) predicate; + case range: + RangePredicate rangePredicate = (RangePredicate) predicate; initFromForRange( rangePredicate, treeKeyFrom ); initToForRange( rangePredicate, treeKeyTo ); break; @@ -74,10 +74,10 @@ boolean initializeRangeForQuery( KEY treeKeyFrom, KEY treeKeyTo, IndexQuery[] pr return false; } - private void initToForRange( NumberRangePredicate rangePredicate, KEY treeKeyTo ) + private void initToForRange( RangePredicate rangePredicate, KEY treeKeyTo ) { - Value toValue = rangePredicate.toAsValue(); - if ( toValue.valueGroup() == ValueGroup.NO_VALUE ) + Value toValue = rangePredicate.toValue(); + if ( toValue == Values.NO_VALUE ) { treeKeyTo.initAsHighest(); } @@ -88,10 +88,10 @@ private void initToForRange( NumberRangePredicate rangePredicate, KEY treeKeyTo } } - private void initFromForRange( NumberRangePredicate rangePredicate, KEY treeKeyFrom ) + private void initFromForRange( RangePredicate rangePredicate, KEY treeKeyFrom ) { - Value fromValue = rangePredicate.fromAsValue(); - if ( fromValue.valueGroup() == ValueGroup.NO_VALUE ) + Value fromValue = rangePredicate.fromValue(); + if ( fromValue == Values.NO_VALUE ) { treeKeyFrom.initAsLowest(); } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/SpatialSchemaIndexReader.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/SpatialSchemaIndexReader.java index 7cfef25d1ba8f..55ae062476555 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/SpatialSchemaIndexReader.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/SpatialSchemaIndexReader.java @@ -91,7 +91,7 @@ public void query( IndexProgressor.NodeValueClient cursor, IndexOrder indexOrder case exact: startSeekForExact( cursor, ((ExactPredicate) predicate).value(), predicate ); break; - case rangeGeometric: + case range: GeometryRangePredicate rangePredicate = (GeometryRangePredicate) predicate; if ( !rangePredicate.crs().equals( spatial.crs ) ) { diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/StringSchemaIndexReader.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/StringSchemaIndexReader.java index 7eace4e2577ce..fb777f4cfba81 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/StringSchemaIndexReader.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/StringSchemaIndexReader.java @@ -24,11 +24,11 @@ import org.neo4j.internal.kernel.api.IndexOrder; import org.neo4j.internal.kernel.api.IndexQuery; import org.neo4j.internal.kernel.api.IndexQuery.ExactPredicate; -import org.neo4j.internal.kernel.api.IndexQuery.StringRangePredicate; import org.neo4j.kernel.api.schema.index.SchemaIndexDescriptor; +import org.neo4j.internal.kernel.api.IndexQuery.RangePredicate; import org.neo4j.kernel.impl.api.index.sampling.IndexSamplingConfig; import org.neo4j.values.storable.Value; -import org.neo4j.values.storable.ValueGroup; +import org.neo4j.values.storable.Values; import static org.neo4j.internal.kernel.api.IndexQuery.StringPrefixPredicate; @@ -66,8 +66,8 @@ boolean initializeRangeForQuery( StringSchemaKey treeKeyFrom, StringSchemaKey tr treeKeyFrom.from( Long.MIN_VALUE, exactPredicate.value() ); treeKeyTo.from( Long.MAX_VALUE, exactPredicate.value() ); return false; - case rangeString: - StringRangePredicate rangePredicate = (StringRangePredicate)predicate; + case range: + RangePredicate rangePredicate = (RangePredicate)predicate; initFromForRange( rangePredicate, treeKeyFrom ); initToForRange( rangePredicate, treeKeyTo ); return false; @@ -86,10 +86,10 @@ boolean initializeRangeForQuery( StringSchemaKey treeKeyFrom, StringSchemaKey tr } } - private void initFromForRange( StringRangePredicate rangePredicate, StringSchemaKey treeKeyFrom ) + private void initFromForRange( RangePredicate rangePredicate, StringSchemaKey treeKeyFrom ) { - Value fromValue = rangePredicate.fromAsValue(); - if ( fromValue.valueGroup() == ValueGroup.NO_VALUE ) + Value fromValue = rangePredicate.fromValue(); + if ( fromValue == Values.NO_VALUE ) { treeKeyFrom.initAsLowest(); } @@ -100,10 +100,10 @@ private void initFromForRange( StringRangePredicate rangePredicate, StringSchema } } - private void initToForRange( StringRangePredicate rangePredicate, StringSchemaKey treeKeyTo ) + private void initToForRange( RangePredicate rangePredicate, StringSchemaKey treeKeyTo ) { - Value toValue = rangePredicate.toAsValue(); - if ( toValue.valueGroup() == ValueGroup.NO_VALUE ) + Value toValue = rangePredicate.toValue(); + if ( toValue == Values.NO_VALUE ) { treeKeyTo.initAsHighest(); } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/TemporalIndexReader.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/TemporalIndexReader.java index c81c5ee19bd9b..af92c3492a946 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/TemporalIndexReader.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/TemporalIndexReader.java @@ -30,7 +30,6 @@ import org.neo4j.internal.kernel.api.IndexQuery; import org.neo4j.internal.kernel.api.IndexQuery.ExactPredicate; import org.neo4j.internal.kernel.api.IndexQuery.ExistsPredicate; -import org.neo4j.internal.kernel.api.IndexQuery.GeometryRangePredicate; import org.neo4j.kernel.api.schema.index.SchemaIndexDescriptor; import org.neo4j.kernel.impl.index.schema.fusion.BridgingIndexProgressor; import org.neo4j.kernel.impl.index.schema.fusion.FusionIndexSampler; diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/fusion/FusionIndexReader.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/fusion/FusionIndexReader.java index 062e0a81f7214..08a51cb8dfc72 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/fusion/FusionIndexReader.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/fusion/FusionIndexReader.java @@ -28,9 +28,7 @@ import org.neo4j.internal.kernel.api.IndexQuery; import org.neo4j.internal.kernel.api.IndexQuery.ExactPredicate; import org.neo4j.internal.kernel.api.IndexQuery.ExistsPredicate; -import org.neo4j.internal.kernel.api.IndexQuery.GeometryRangePredicate; -import org.neo4j.internal.kernel.api.IndexQuery.NumberRangePredicate; -import org.neo4j.internal.kernel.api.IndexQuery.StringRangePredicate; +import org.neo4j.internal.kernel.api.IndexQuery.RangePredicate; import org.neo4j.kernel.api.exceptions.index.IndexNotApplicableKernelException; import org.neo4j.kernel.api.schema.index.SchemaIndexDescriptor; import org.neo4j.kernel.impl.api.schema.BridgingIndexProgressor; @@ -40,6 +38,7 @@ import org.neo4j.storageengine.api.schema.IndexReader; import org.neo4j.storageengine.api.schema.IndexSampler; import org.neo4j.values.storable.Value; +import org.neo4j.values.storable.ValueGroup; import static java.lang.String.format; import static org.neo4j.internal.kernel.api.IndexQuery.StringContainsPredicate; @@ -85,34 +84,32 @@ public PrimitiveLongResourceIterator query( IndexQuery... predicates ) throws In if ( predicate instanceof ExactPredicate ) { - ExactPredicate exactPredicate = (ExactPredicate) predicates[0]; + ExactPredicate exactPredicate = (ExactPredicate) predicate; return selector.select( instances, exactPredicate.value() ).query( predicates ); } - if ( predicate instanceof NumberRangePredicate ) - { - return instances[NUMBER].query( predicates ); - } - - if ( predicate instanceof StringRangePredicate || - predicate instanceof StringPrefixPredicate || + if ( predicate instanceof StringPrefixPredicate || predicate instanceof StringSuffixPredicate || predicate instanceof StringContainsPredicate ) { return instances[STRING].query( predicate ); } - if ( predicate instanceof GeometryRangePredicate ) + if ( predicate instanceof RangePredicate ) { - return instances[SPATIAL].query( predicates ); + switch ( predicate.valueGroup() ) + { + case NUMBER: + return instances[NUMBER].query( predicates ); + case GEOMETRY: + return instances[SPATIAL].query( predicates ); + case TEXT: + return instances[STRING].query( predicates ); + default: // fall through + } + // TODO: support temporal range queries } -// TODO: support temporal range queries -// if ( predicates[0] instanceof TemporalRangePredicate ) -// { -// return temporalReader.query( predicates[0] ); -// } - // todo: There will be no ordering of the node ids here. Is this a problem? if ( predicate instanceof ExistsPredicate ) { @@ -136,19 +133,12 @@ public void query( IndexProgressor.NodeValueClient cursor, IndexOrder indexOrder if ( predicate instanceof ExactPredicate ) { - ExactPredicate exactPredicate = (ExactPredicate) predicates[0]; + ExactPredicate exactPredicate = (ExactPredicate) predicate; selector.select( instances, exactPredicate.value() ).query( cursor, indexOrder, predicate ); return; } - if ( predicate instanceof NumberRangePredicate ) - { - instances[NUMBER].query( cursor, indexOrder, predicate ); - return; - } - - if ( predicate instanceof StringRangePredicate || - predicate instanceof StringPrefixPredicate || + if ( predicate instanceof StringPrefixPredicate || predicate instanceof StringSuffixPredicate || predicate instanceof StringContainsPredicate ) { @@ -156,18 +146,24 @@ public void query( IndexProgressor.NodeValueClient cursor, IndexOrder indexOrder return; } - if ( predicate instanceof GeometryRangePredicate ) + if ( predicate instanceof RangePredicate ) { - instances[SPATIAL].query( cursor, indexOrder, predicate ); - return; + switch ( predicate.valueGroup() ) + { + case NUMBER: + instances[NUMBER].query( cursor, indexOrder, predicates ); + return; + case GEOMETRY: + instances[SPATIAL].query( cursor, indexOrder, predicates ); + return; + case TEXT: + instances[STRING].query( cursor, indexOrder, predicates ); + return; + default: // fall through + } + // TODO: support temporal range queries } -// TODO: support temporal range queries -// if ( predicates[0] instanceof TemporalRangePredicate ) -// { -// return temporalReader.query( predicates[0] ); -// } - // todo: There will be no ordering of the node ids here. Is this a problem? if ( predicate instanceof ExistsPredicate ) { @@ -204,16 +200,13 @@ public boolean hasFullValuePrecision( IndexQuery... predicates ) Value value = ((ExactPredicate) predicate).value(); return selector.select( instances, value ).hasFullValuePrecision( predicates ); } - if ( predicate instanceof NumberRangePredicate ) + + if ( predicate instanceof RangePredicate && predicate.valueGroup() == ValueGroup.NUMBER ) { return instances[NUMBER].hasFullValuePrecision( predicates ); } + // TODO: support temporal range queries -// TODO: support temporal range queries -// if ( predicate instanceof temporalRangePredicate ) -// { -// return temporalReader.hasFullValuePrecision( predicates ); -// } return false; } } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/fusion/SpatialFusionIndexReader.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/fusion/SpatialFusionIndexReader.java index f05c098b6ba1c..d6dcc90c97321 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/fusion/SpatialFusionIndexReader.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/fusion/SpatialFusionIndexReader.java @@ -114,7 +114,7 @@ public PrimitiveLongResourceIterator query( IndexQuery... predicates ) throws In } } - private IndexReader selectIf( IndexQuery... predicates ) throws IndexNotApplicableKernelException + private IndexReader selectIf( IndexQuery... predicates ) { if ( predicates[0] instanceof ExactPredicate ) { diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultNodeValueIndexCursor.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultNodeValueIndexCursor.java index 7fe4cf43d6784..4bc382e6496a6 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultNodeValueIndexCursor.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultNodeValueIndexCursor.java @@ -33,6 +33,7 @@ import org.neo4j.storageengine.api.schema.IndexProgressor.NodeValueClient; import org.neo4j.storageengine.api.txstate.PrimitiveLongReadableDiffSets; import org.neo4j.values.storable.Value; +import org.neo4j.values.storable.ValueGroup; import static java.util.Arrays.stream; import static org.neo4j.collection.primitive.PrimitiveLongCollections.asSet; @@ -80,19 +81,9 @@ public void initialize( SchemaIndexDescriptor descriptor, IndexProgressor progre scanQuery( descriptor ); break; - case rangeNumeric: + case range: assert query.length == 1; - numericRangeQuery( descriptor, (IndexQuery.NumberRangePredicate) query[0] ); - break; - - case rangeGeometric: - assert query.length == 1; - geometricRangeQuery( descriptor, (IndexQuery.GeometryRangePredicate) query[0] ); - break; - - case rangeString: - assert query.length == 1; - stringRangeQuery( descriptor, (IndexQuery.StringRangePredicate) query[0] ); + rangeQuery( descriptor, (IndexQuery.RangePredicate) query[0] ); break; case stringPrefix: @@ -238,42 +229,17 @@ private void prefixQuery( SchemaIndexDescriptor descriptor, IndexQuery.StringPre } } - private void stringRangeQuery( SchemaIndexDescriptor descriptor, IndexQuery.StringRangePredicate predicate ) - { - needsValues = true; - if ( read.hasTxStateWithChanges() ) - { - TransactionState txState = read.txState(); - PrimitiveLongReadableDiffSets changes = txState.indexUpdatesForRangeSeekByString( - descriptor, predicate.from(), predicate.fromInclusive(), predicate.to(), - predicate.toInclusive() ); - added = changes.augment( emptyIterator() ); - removed = removed( txState, changes ); - } - } - - private void numericRangeQuery( SchemaIndexDescriptor descriptor, IndexQuery.NumberRangePredicate predicate ) - { - needsValues = true; - if ( read.hasTxStateWithChanges() ) - { - TransactionState txState = read.txState(); - PrimitiveLongReadableDiffSets changes = txState.indexUpdatesForRangeSeekByNumber( - descriptor, predicate.from(), predicate.fromInclusive(), predicate.to(), - predicate.toInclusive() ); - added = changes.augment( emptyIterator() ); - removed = removed( txState, changes ); - } - } - - private void geometricRangeQuery( SchemaIndexDescriptor descriptor, IndexQuery.GeometryRangePredicate predicate ) + private void rangeQuery( SchemaIndexDescriptor descriptor, IndexQuery.RangePredicate predicate ) { + ValueGroup valueGroup = predicate.valueGroup(); + this.needsValues = valueGroup == ValueGroup.TEXT || valueGroup == ValueGroup.NUMBER; if ( read.hasTxStateWithChanges() ) { TransactionState txState = read.txState(); - PrimitiveLongReadableDiffSets changes = txState.indexUpdatesForRangeSeekByGeometry( - descriptor, predicate.from(), predicate.fromInclusive(), predicate.to(), - predicate.toInclusive() ); + PrimitiveLongReadableDiffSets changes = txState.indexUpdatesForRangeSeek( + descriptor, valueGroup, + predicate.fromValue(), predicate.fromInclusive(), + predicate.toValue(), predicate.toInclusive() ); added = changes.augment( emptyIterator() ); removed = removed( txState, changes ); } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/Read.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/Read.java index ca730927ce9cd..ee810b2d13dea 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/Read.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/Read.java @@ -69,6 +69,8 @@ import static org.neo4j.kernel.impl.newapi.RelationshipDirection.LOOP; import static org.neo4j.kernel.impl.newapi.RelationshipDirection.OUTGOING; import static org.neo4j.kernel.impl.store.record.AbstractBaseRecord.NO_ID; +import static org.neo4j.values.storable.ValueGroup.GEOMETRY; +import static org.neo4j.values.storable.ValueGroup.NUMBER; abstract class Read implements TxStateHolder, org.neo4j.internal.kernel.api.Read, @@ -111,9 +113,9 @@ public final void nodeIndexSeek( { switch ( q.type() ) { - case rangeGeometric: - case rangeNumeric: - if ( !reader.hasFullValuePrecision( q ) ) + case range: + ValueGroup valueGroup = q.valueGroup(); + if ( ( valueGroup == NUMBER || valueGroup == GEOMETRY ) && !reader.hasFullValuePrecision( q ) ) { filters[j++] = q; } diff --git a/community/kernel/src/main/java/org/neo4j/storageengine/api/txstate/ReadableTransactionState.java b/community/kernel/src/main/java/org/neo4j/storageengine/api/txstate/ReadableTransactionState.java index 8627b42ad78a0..08cc38889e0ec 100644 --- a/community/kernel/src/main/java/org/neo4j/storageengine/api/txstate/ReadableTransactionState.java +++ b/community/kernel/src/main/java/org/neo4j/storageengine/api/txstate/ReadableTransactionState.java @@ -38,7 +38,8 @@ import org.neo4j.storageengine.api.PropertyItem; import org.neo4j.storageengine.api.RelationshipItem; import org.neo4j.storageengine.api.StorageProperty; -import org.neo4j.values.storable.PointValue; +import org.neo4j.values.storable.Value; +import org.neo4j.values.storable.ValueGroup; import org.neo4j.values.storable.ValueTuple; /** @@ -145,14 +146,14 @@ PrimitiveLongReadableDiffSets indexUpdatesForRangeSeekByNumber( SchemaIndexDescr Number lower, boolean includeLower, Number upper, boolean includeUpper ); - PrimitiveLongReadableDiffSets indexUpdatesForRangeSeekByGeometry( SchemaIndexDescriptor index, - PointValue lower, boolean includeLower, - PointValue upper, boolean includeUpper ); - PrimitiveLongReadableDiffSets indexUpdatesForRangeSeekByString( SchemaIndexDescriptor index, String lower, boolean includeLower, String upper, boolean includeUpper ); + PrimitiveLongReadableDiffSets indexUpdatesForRangeSeek( SchemaIndexDescriptor index, ValueGroup valueGroup, + Value lower, boolean includeLower, + Value upper, boolean includeUpper ); + PrimitiveLongReadableDiffSets indexUpdatesForRangeSeekByPrefix( SchemaIndexDescriptor index, String prefix ); NodeState getNodeState( long id ); diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/inmemory/HashBasedIndex.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/inmemory/HashBasedIndex.java index 07fef6d0be3d3..bf4017c39c251 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/inmemory/HashBasedIndex.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/inmemory/HashBasedIndex.java @@ -36,6 +36,7 @@ import org.neo4j.storageengine.api.schema.IndexSampler; import org.neo4j.values.storable.Value; +import static java.lang.String.format; import static org.neo4j.collection.primitive.PrimitiveLongCollections.emptyIterator; import static org.neo4j.collection.primitive.PrimitiveLongCollections.resourceIterator; import static org.neo4j.collection.primitive.PrimitiveLongCollections.toPrimitiveIterator; @@ -273,12 +274,21 @@ public PrimitiveLongResourceIterator query( IndexQuery... predicates ) return scan(); case exact: return seek( ((IndexQuery.ExactPredicate) predicate).value() ); - case rangeNumeric: - IndexQuery.NumberRangePredicate np = (IndexQuery.NumberRangePredicate) predicate; - return rangeSeekByNumberInclusive( np.from(), np.to() ); - case rangeString: - IndexQuery.StringRangePredicate srp = (IndexQuery.StringRangePredicate) predicate; - return rangeSeekByString( srp.from(), srp.fromInclusive(), srp.to(), srp.toInclusive() ); + case range: + switch ( predicate.valueGroup() ) + { + case NUMBER: + IndexQuery.NumberRangePredicate np = (IndexQuery.NumberRangePredicate) predicate; + return rangeSeekByNumberInclusive( np.from(), np.to() ); + + case TEXT: + IndexQuery.TextRangePredicate srp = (IndexQuery.TextRangePredicate) predicate; + return rangeSeekByString( srp.from(), srp.fromInclusive(), srp.to(), srp.toInclusive() ); + + default: + throw new UnsupportedOperationException( + format( "Range scan of valueGroup %s is not supported", predicate.valueGroup() ) ); + } case stringPrefix: IndexQuery.StringPrefixPredicate spp = (IndexQuery.StringPrefixPredicate) predicate; return rangeSeekByPrefix( spp.prefix() ); diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/state/StateHandlingStatementOperationsTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/state/StateHandlingStatementOperationsTest.java index 10f188ecd8084..1637cef4bbf20 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/state/StateHandlingStatementOperationsTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/state/StateHandlingStatementOperationsTest.java @@ -31,6 +31,7 @@ import org.neo4j.cursor.Cursor; import org.neo4j.helpers.collection.Iterables; import org.neo4j.internal.kernel.api.IndexQuery; +import org.neo4j.internal.kernel.api.IndexQuery.RangePredicate; import org.neo4j.internal.kernel.api.schema.LabelSchemaDescriptor; import org.neo4j.internal.kernel.api.schema.constraints.ConstraintDescriptor; import org.neo4j.kernel.api.AssertOpen; @@ -59,7 +60,9 @@ import org.neo4j.storageengine.api.StorageStatement; import org.neo4j.storageengine.api.StoreReadLayer; import org.neo4j.storageengine.api.schema.IndexReader; +import org.neo4j.values.storable.NumberValue; import org.neo4j.values.storable.Value; +import org.neo4j.values.storable.ValueGroup; import org.neo4j.values.storable.ValueTuple; import org.neo4j.values.storable.Values; @@ -83,6 +86,7 @@ import static org.neo4j.kernel.impl.api.StatementOperationsTestHelper.mockedState; import static org.neo4j.kernel.impl.api.state.StubCursors.asNodeCursor; import static org.neo4j.kernel.impl.api.state.StubCursors.asPropertyCursor; +import static org.neo4j.values.storable.Values.stringValue; public class StateHandlingStatementOperationsTest { @@ -367,8 +371,8 @@ public void shouldConsiderTransactionStateDuringIndexBetweenRangeSeekByNumberWit // Given final int propertyKey = 2; final int inRange = 15; - int lower = 10; - int upper = 20; + NumberValue lower = Values.numberValue( 10 ); + NumberValue upper = Values.numberValue( 20 ); TransactionState txState = mock( TransactionState.class ); KernelStatement statement = mock( KernelStatement.class ); @@ -376,8 +380,8 @@ public void shouldConsiderTransactionStateDuringIndexBetweenRangeSeekByNumberWit when( statement.txState() ).thenReturn( txState ); StorageStatement storageStatement = mock( StorageStatement.class ); when( statement.getStoreStatement() ).thenReturn( storageStatement ); - when( txState.indexUpdatesForRangeSeekByNumber( index, lower, true, upper, false ) ).thenReturn( createDiffSets() - ); + when( txState.indexUpdatesForRangeSeek( index, ValueGroup.NUMBER, lower, true, upper, false ) ) + .thenReturn( createDiffSets() ); when( txState.addedAndRemovedNodes() ).thenReturn( new DiffSets<>( Collections.singleton( 45L ), Collections.singleton( 46L ) ) ); @@ -392,8 +396,8 @@ public void shouldConsiderTransactionStateDuringIndexBetweenRangeSeekByNumberWit } ); IndexReader indexReader = addMockedIndexReader( storageStatement ); - IndexQuery.NumberRangePredicate indexQuery = - IndexQuery.range( index.schema().getPropertyId(), lower, true, upper, false ); + RangePredicate indexQuery = + IndexQuery.range( index.schema().getPropertyId(), lower.asObject(), true, upper.asObject(), false ); when( indexReader.query( indexQuery ) ).thenReturn( PrimitiveLongCollections.resourceIterator( PrimitiveLongCollections.iterator( 43L, 44L, 46L ), null ) ); @@ -423,14 +427,15 @@ public void shouldConsiderTransactionStateDuringIndexBetweenRangeSeekByStringWit KernelStatement statement = mock( KernelStatement.class ); when( statement.hasTxStateWithChanges() ).thenReturn( true ); when( statement.txState() ).thenReturn( txState ); - when( txState.indexUpdatesForRangeSeekByString( index, "Anne", true, "Bill", false ) ).thenReturn( createDiffSets() ); + when( txState.indexUpdatesForRangeSeek( index, ValueGroup.TEXT, stringValue( "Anne" ), true, stringValue( "Bill" ), false ) ) + .thenReturn( createDiffSets() ); when( txState.addedAndRemovedNodes() ).thenReturn( new DiffSets<>( Collections.singleton( 45L ), Collections.singleton( 46L ) ) ); StoreReadLayer storeReadLayer = mock( StoreReadLayer.class ); IndexReader indexReader = addMockedIndexReader( statement ); - IndexQuery.StringRangePredicate rangePredicate = + RangePredicate rangePredicate = IndexQuery.range( index.schema().getPropertyId(), "Anne", true, "Bill", false ); when( indexReader.query( rangePredicate ) ).thenReturn( PrimitiveLongCollections.resourceIterator( PrimitiveLongCollections.iterator( 43L, 44L, 46L ), null ) ); diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NumberSchemaIndexAccessorTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NumberSchemaIndexAccessorTest.java index 6ae33c21ec9ba..dce6b128f8b87 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NumberSchemaIndexAccessorTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NumberSchemaIndexAccessorTest.java @@ -58,7 +58,7 @@ public void respectIndexOrder() throws Exception // when IndexReader reader = accessor.newReader(); - IndexQuery.NumberRangePredicate supportedQuery = + IndexQuery.RangePredicate supportedQuery = IndexQuery.range( 0, Double.NEGATIVE_INFINITY, true, Double.POSITIVE_INFINITY, true ); for ( IndexOrder supportedOrder : NumberIndexProvider.CAPABILITY.orderCapability( ValueGroup.NUMBER ) ) diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/fusion/FusionIndexReaderTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/fusion/FusionIndexReaderTest.java index ab7225dca3d42..6e8f4631ff256 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/fusion/FusionIndexReaderTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/fusion/FusionIndexReaderTest.java @@ -28,11 +28,9 @@ import org.neo4j.collection.primitive.PrimitiveLongResourceIterator; import org.neo4j.collection.primitive.PrimitiveLongSet; import org.neo4j.internal.kernel.api.IndexQuery; -import org.neo4j.internal.kernel.api.IndexQuery.GeometryRangePredicate; -import org.neo4j.internal.kernel.api.IndexQuery.NumberRangePredicate; +import org.neo4j.internal.kernel.api.IndexQuery.RangePredicate; import org.neo4j.internal.kernel.api.IndexQuery.StringContainsPredicate; import org.neo4j.internal.kernel.api.IndexQuery.StringPrefixPredicate; -import org.neo4j.internal.kernel.api.IndexQuery.StringRangePredicate; import org.neo4j.internal.kernel.api.IndexQuery.StringSuffixPredicate; import org.neo4j.kernel.api.exceptions.index.IndexNotApplicableKernelException; import org.neo4j.kernel.api.schema.index.SchemaIndexDescriptorFactory; @@ -232,7 +230,7 @@ public void mustSelectLuceneForExactPredicateWithOtherValue() throws Exception public void mustSelectStringForRangeStringPredicate() throws Exception { // given - StringRangePredicate stringRange = IndexQuery.range( PROP_KEY, "abc", true, "def", false ); + RangePredicate stringRange = IndexQuery.range( PROP_KEY, "abc", true, "def", false ); // then verifyQueryWithCorrectReader( stringReader, stringRange ); @@ -242,7 +240,7 @@ public void mustSelectStringForRangeStringPredicate() throws Exception public void mustSelectNumberForRangeNumericPredicate() throws Exception { // given - NumberRangePredicate numberRange = IndexQuery.range( PROP_KEY, 0, true, 1, false ); + RangePredicate numberRange = IndexQuery.range( PROP_KEY, 0, true, 1, false ); // then verifyQueryWithCorrectReader( numberReader, numberRange ); @@ -254,7 +252,7 @@ public void mustSelectSpatialForRangeGeometricPredicate() throws Exception // given PointValue from = Values.pointValue( CoordinateReferenceSystem.Cartesian, 1.0, 1.0); PointValue to = Values.pointValue( CoordinateReferenceSystem.Cartesian, 2.0, 2.0); - GeometryRangePredicate geometryRange = IndexQuery.range( PROP_KEY, from, true, to, false ); + RangePredicate geometryRange = IndexQuery.range( PROP_KEY, from, true, to, false ); // then verifyQueryWithCorrectReader( spatialReader, geometryRange ); diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/fusion/SpatialFusionIndexReaderTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/fusion/SpatialFusionIndexReaderTest.java index 1687aee61dfa6..8ca0ffe3b4c54 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/fusion/SpatialFusionIndexReaderTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/fusion/SpatialFusionIndexReaderTest.java @@ -32,6 +32,7 @@ import org.neo4j.collection.primitive.PrimitiveLongSet; import org.neo4j.internal.kernel.api.IndexOrder; import org.neo4j.internal.kernel.api.IndexQuery; +import org.neo4j.internal.kernel.api.IndexQuery.RangePredicate; import org.neo4j.kernel.api.exceptions.index.IndexNotApplicableKernelException; import org.neo4j.kernel.api.schema.index.SchemaIndexDescriptorFactory; import org.neo4j.storageengine.api.schema.IndexReader; @@ -126,7 +127,7 @@ public void mustSelectCorrectForRangeGeometricPredicate() throws Exception { PointValue from = Values.pointValue( CoordinateReferenceSystem.Cartesian, 1.0, 1.0 ); PointValue to = Values.pointValue( CoordinateReferenceSystem.Cartesian, 2.0, 2.0 ); - IndexQuery.GeometryRangePredicate geometryRange = IndexQuery.range( PROP_KEY, from, true, to, false ); + RangePredicate geometryRange = IndexQuery.range( PROP_KEY, from, true, to, false ); verifyQueryWithCorrectReader( readerMap.get( CoordinateReferenceSystem.Cartesian ), geometryRange ); } @@ -134,7 +135,7 @@ public void mustSelectCorrectForRangeGeometricPredicate() throws Exception { PointValue from = Values.pointValue( CoordinateReferenceSystem.WGS84, 1.0, 1.0 ); PointValue to = Values.pointValue( CoordinateReferenceSystem.WGS84, 2.0, 2.0 ); - IndexQuery.GeometryRangePredicate geometryRange = IndexQuery.range( PROP_KEY, from, true, to, false ); + RangePredicate geometryRange = IndexQuery.range( PROP_KEY, from, true, to, false ); verifyQueryWithCorrectReader( readerMap.get( CoordinateReferenceSystem.WGS84 ), geometryRange ); } diff --git a/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/reader/SimpleIndexReader.java b/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/reader/SimpleIndexReader.java index fd7d08c8ab975..ec0c357e4aa60 100644 --- a/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/reader/SimpleIndexReader.java +++ b/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/reader/SimpleIndexReader.java @@ -48,6 +48,7 @@ import org.neo4j.storageengine.api.schema.IndexSampler; import org.neo4j.values.storable.Value; +import static java.lang.String.format; import static org.neo4j.internal.kernel.api.IndexQuery.IndexQueryType.exact; import static org.neo4j.kernel.api.impl.schema.LuceneDocumentStructure.NODE_ID_KEY; import static org.neo4j.kernel.api.schema.index.SchemaIndexDescriptor.Type.UNIQUE; @@ -142,14 +143,24 @@ private Query toLuceneQuery( IndexQuery... predicates ) throws IndexNotApplicabl } } return LuceneDocumentStructure.newScanQuery(); - case rangeNumeric: + case range: assertNotComposite( predicates ); - IndexQuery.NumberRangePredicate np = (IndexQuery.NumberRangePredicate) predicate; - return LuceneDocumentStructure.newInclusiveNumericRangeSeekQuery( np.from(), np.to() ); - case rangeString: - assertNotComposite( predicates ); - IndexQuery.StringRangePredicate sp = (IndexQuery.StringRangePredicate) predicate; - return LuceneDocumentStructure.newRangeSeekByStringQuery( sp.from(), sp.fromInclusive(), sp.to(), sp.toInclusive() ); + switch ( predicate.valueGroup() ) + { + case NUMBER: + IndexQuery.RangePredicate np = (IndexQuery.RangePredicate) predicate; + return LuceneDocumentStructure.newInclusiveNumericRangeSeekQuery( (Number)np.fromValue().asObject(), + (Number)np.toValue().asObject() ); + + case TEXT: + IndexQuery.RangePredicate sp = (IndexQuery.RangePredicate) predicate; + return LuceneDocumentStructure.newRangeSeekByStringQuery( (String)sp.fromValue().asObject(), sp.fromInclusive(), + (String)sp.toValue().asObject(), sp.toInclusive() ); + default: + throw new UnsupportedOperationException( + format( "Range scans of value group %s are not supported", predicate.valueGroup() ) ); + } + case stringPrefix: assertNotComposite( predicates ); IndexQuery.StringPrefixPredicate spp = (IndexQuery.StringPrefixPredicate) predicate; diff --git a/community/lucene-index/src/test/java/org/neo4j/kernel/api/impl/schema/reader/PartitionedIndexReaderTest.java b/community/lucene-index/src/test/java/org/neo4j/kernel/api/impl/schema/reader/PartitionedIndexReaderTest.java index 01c31658a8686..ff0def07c0e02 100644 --- a/community/lucene-index/src/test/java/org/neo4j/kernel/api/impl/schema/reader/PartitionedIndexReaderTest.java +++ b/community/lucene-index/src/test/java/org/neo4j/kernel/api/impl/schema/reader/PartitionedIndexReaderTest.java @@ -100,7 +100,7 @@ public void rangeSeekByNumberOverPartitions() throws Exception { PartitionedIndexReader indexReader = createPartitionedReaderFromReaders(); - IndexQuery.NumberRangePredicate query = IndexQuery.range( 1, 1, true, 2, true ); + IndexQuery.RangePredicate query = IndexQuery.range( 1, 1, true, 2, true ); when( indexReader1.query( query ) ).thenReturn( PrimitiveLongResourceCollections.iterator( null, 1 ) ); when( indexReader2.query( query ) ).thenReturn( PrimitiveLongResourceCollections.iterator( null, 2 ) ); when( indexReader3.query( query ) ).thenReturn( PrimitiveLongResourceCollections.iterator( null, 3 ) ); @@ -115,7 +115,7 @@ public void rangeSeekByStringOverPartitions() throws Exception { PartitionedIndexReader indexReader = createPartitionedReaderFromReaders(); - IndexQuery.StringRangePredicate query = IndexQuery.range( 1, "a", false, "b", true ); + IndexQuery.RangePredicate query = IndexQuery.range( 1, "a", false, "b", true ); when( indexReader1.query( query ) ).thenReturn( PrimitiveLongResourceCollections.iterator( null, 1 ) ); when( indexReader2.query( query ) ).thenReturn( PrimitiveLongResourceCollections.iterator( null, 2 ) ); when( indexReader3.query( query ) ).thenReturn( PrimitiveLongResourceCollections.iterator( null, 3 ) ); diff --git a/community/values/src/main/java/org/neo4j/values/storable/Values.java b/community/values/src/main/java/org/neo4j/values/storable/Values.java index c49ffd2041d37..0a50765876568 100644 --- a/community/values/src/main/java/org/neo4j/values/storable/Values.java +++ b/community/values/src/main/java/org/neo4j/values/storable/Values.java @@ -186,7 +186,7 @@ public static Value stringOrNoValue( String value ) } } - public static Value numberValue( Number number ) + public static NumberValue numberValue( Number number ) { if ( number instanceof Long ) { @@ -212,10 +212,6 @@ public static Value numberValue( Number number ) { return shortValue( number.shortValue() ); } - if ( number == null ) - { - return NO_VALUE; - } throw new UnsupportedOperationException( "Unsupported type of Number " + number.toString() ); } @@ -704,4 +700,28 @@ private static T copy( Object[] value, T target ) } return target; } + + public static Value minValue( ValueGroup valueGroup, Value value ) + { + switch ( valueGroup ) + { + case TEXT: return MIN_STRING; + case NUMBER: return MIN_NUMBER; + case GEOMETRY: return minPointValue( (PointValue)value ); + default: throw new IllegalStateException( + format( "The minValue for valueGroup %s is not defined yet", valueGroup ) ); + } + } + + public static Value maxValue( ValueGroup valueGroup, Value value ) + { + switch ( valueGroup ) + { + case TEXT: return MAX_STRING; + case NUMBER: return MAX_NUMBER; + case GEOMETRY: return maxPointValue( (PointValue)value ); + default: throw new IllegalStateException( + format( "The maxValue for valueGroup %s is not defined yet", valueGroup ) ); + } + } }