From f29bd08f1e4f819b3e2eadc243c12f9ff00a2aa8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Finn=C3=A9?= Date: Thu, 8 Mar 2018 11:50:34 +0100 Subject: [PATCH] Moved shared schema key code to NativeSchemaKey This is now especially important since the value of compareId plays a bigger part in correctness of updates to the tree. --- .../impl/index/schema/DateSchemaKey.java | 48 ++------------ .../impl/index/schema/NativeSchemaKey.java | 62 +++++++++++++++---- .../impl/index/schema/NumberSchemaKey.java | 51 ++------------- .../impl/index/schema/SpatialSchemaKey.java | 53 +++------------- .../impl/index/schema/StringSchemaKey.java | 52 ++-------------- 5 files changed, 74 insertions(+), 192 deletions(-) diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/DateSchemaKey.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/DateSchemaKey.java index 21afa9636d6f2..912ea13b4abfa 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/DateSchemaKey.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/DateSchemaKey.java @@ -22,7 +22,6 @@ import org.neo4j.index.internal.gbptree.GBPTree; import org.neo4j.values.storable.DateValue; import org.neo4j.values.storable.Value; -import org.neo4j.values.storable.ValueWriter; import static java.lang.String.format; @@ -30,44 +29,17 @@ * Includes value and entity id (to be able to handle non-unique values). A value can be any {@link String}, * or rather any string that {@link GBPTree} can handle. */ -class DateSchemaKey extends ValueWriter.Adapter implements NativeSchemaKey +class DateSchemaKey extends NativeSchemaKey { static final int SIZE = Long.BYTES + /* raw value bits */ Long.BYTES; /* entityId */ - private long entityId; - private boolean compareId; - long epochDay; - public void setCompareId( boolean compareId ) - { - this.compareId = compareId; - } - - public boolean getCompareId() - { - return compareId; - } - @Override - public long getEntityId() + void from( Value... values ) { - return entityId; - } - - @Override - public void setEntityId( long entityId ) - { - this.entityId = entityId; - } - - @Override - public void from( long entityId, Value... values ) - { - this.entityId = entityId; - compareId = false; assertValidValue( values ).writeTo( this ); } @@ -89,12 +61,6 @@ private DateValue assertValidValue( Value... values ) return (DateValue) values[0]; } - @Override - public String propertiesAsString() - { - return asValue().toString(); - } - @Override public Value asValue() { @@ -102,19 +68,15 @@ public Value asValue() } @Override - public void initAsLowest() + void initValueAsLowest() { epochDay = Long.MIN_VALUE; - entityId = Long.MIN_VALUE; - compareId = true; } @Override - public void initAsHighest() + void initValueAsHighest() { epochDay = Long.MAX_VALUE; - entityId = Long.MAX_VALUE; - compareId = true; } /** @@ -132,7 +94,7 @@ int compareValueTo( DateSchemaKey other ) @Override public String toString() { - return format( "value=%s,entityId=%d,epochDay=%s", asValue(), entityId, epochDay ); + return format( "value=%s,entityId=%d,epochDay=%s", asValue(), getEntityId(), epochDay ); } @Override diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaKey.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaKey.java index 325a663b027b4..c0192bf454063 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaKey.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaKey.java @@ -21,14 +21,20 @@ import org.neo4j.index.internal.gbptree.GBPTree; import org.neo4j.values.storable.Value; +import org.neo4j.values.storable.ValueWriter; /** * Includes value and entity id (to be able to handle non-unique values). * This is the abstraction of what NativeSchemaIndex with friends need from a schema key. * Note that it says nothing about how keys are compared, serialized, read, written, etc. That is the job of Layout. */ -interface NativeSchemaKey +abstract class NativeSchemaKey extends ValueWriter.Adapter { + static final boolean DEFAULT_COMPARE_ID = true; + + private long entityId; + private boolean compareId = DEFAULT_COMPARE_ID; + /** * Marks that comparisons with this key requires also comparing entityId, this allows functionality * of inclusive/exclusive bounds of range queries. @@ -36,25 +42,57 @@ interface NativeSchemaKey *

* Note that {@code compareId} is only an in memory state. */ - void setCompareId( boolean compareId ); + void setCompareId( boolean compareId ) + { + this.compareId = compareId; + } + + boolean getCompareId() + { + return compareId; + } - boolean getCompareId(); + long getEntityId() + { + return entityId; + } - long getEntityId(); + void setEntityId( long entityId ) + { + this.entityId = entityId; + } - void setEntityId( long entityId ); + final void from( long entityId, Value... values ) + { + compareId = DEFAULT_COMPARE_ID; + this.entityId = entityId; + from( values ); + } - void from( long entityId, Value... values ); + abstract void from( Value[] values ); - String propertiesAsString(); + String propertiesAsString() + { + return asValue().toString(); + } - Value asValue(); + abstract Value asValue(); - void initAsLowest(); + final void initAsLowest() + { + compareId = DEFAULT_COMPARE_ID; + entityId = Long.MIN_VALUE; + initValueAsLowest(); + } - void initAsHighest(); + abstract void initValueAsLowest(); - @Override - String toString(); + final void initAsHighest() + { + compareId = DEFAULT_COMPARE_ID; + entityId = Long.MAX_VALUE; + initValueAsHighest(); + } + abstract void initValueAsHighest(); } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NumberSchemaKey.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NumberSchemaKey.java index 73d42036218d1..f6dad3e1273d7 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NumberSchemaKey.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NumberSchemaKey.java @@ -21,7 +21,6 @@ import org.neo4j.values.storable.NumberValue; import org.neo4j.values.storable.Value; -import org.neo4j.values.storable.ValueWriter; import org.neo4j.values.storable.Values; import static java.lang.String.format; @@ -34,7 +33,7 @@ * Distinction between double and float exists because coersions between each other and long may differ. * TODO this should be figured out and potentially reduced to long, double types only. */ -class NumberSchemaKey extends ValueWriter.Adapter implements NativeSchemaKey +class NumberSchemaKey extends NativeSchemaKey { static final int SIZE = Byte.BYTES + /* type of value */ @@ -43,41 +42,13 @@ class NumberSchemaKey extends ValueWriter.Adapter implements N // TODO this could use 6 bytes instead and have the highest 2 bits stored in the type byte Long.BYTES; /* entityId */ - private long entityId; - private boolean compareId = true; - byte type; long rawValueBits; - public void setCompareId( boolean compareId ) - { - this.compareId = compareId; - } - - public boolean getCompareId() - { - return compareId; - } - @Override - public long getEntityId() - { - return entityId; - } - - @Override - public void setEntityId( long entityId ) - { - this.entityId = entityId; - compareId = true; - } - - @Override - public void from( long entityId, Value... values ) + void from( Value... values ) { extractRawBitsAndType( assertValidValue( values ) ); - this.entityId = entityId; - compareId = true; } private NumberValue assertValidValue( Value... values ) @@ -100,31 +71,21 @@ private NumberValue assertValidValue( Value... values ) } @Override - public String propertiesAsString() - { - return asValue().toString(); - } - - @Override - public NumberValue asValue() + NumberValue asValue() { return RawBits.asNumberValue( rawValueBits, type ); } @Override - public void initAsLowest() + void initValueAsLowest() { writeFloatingPoint( Double.NEGATIVE_INFINITY ); - entityId = Long.MIN_VALUE; - compareId = true; } @Override - public void initAsHighest() + void initValueAsHighest() { writeFloatingPoint( Double.POSITIVE_INFINITY ); - entityId = Long.MAX_VALUE; - compareId = true; } /** @@ -152,7 +113,7 @@ private void extractRawBitsAndType( NumberValue value ) @Override public String toString() { - return format( "type=%d,rawValue=%d,value=%s,entityId=%d", type, rawValueBits, asValue(), entityId ); + return format( "type=%d,rawValue=%d,value=%s,entityId=%d", type, rawValueBits, asValue(), getEntityId() ); } @Override diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/SpatialSchemaKey.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/SpatialSchemaKey.java index 6cd0b4db7bbf4..cf01e0ccc444c 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/SpatialSchemaKey.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/SpatialSchemaKey.java @@ -34,15 +34,12 @@ * Includes value and entity id (to be able to handle non-unique values). * A value can be any {@link PointValue} and is represented as a {@code long} to store the 1D mapped version */ -class SpatialSchemaKey implements NativeSchemaKey +class SpatialSchemaKey extends NativeSchemaKey { static final int SIZE = Long.BYTES + /* raw value bits */ Long.BYTES; /* entityId */ - private long entityId; - private boolean compareId; - long rawValueBits; CoordinateReferenceSystem crs; SpaceFillingCurve curve; @@ -54,41 +51,9 @@ class SpatialSchemaKey implements NativeSchemaKey } @Override - public void setCompareId( boolean entityIdIsSpecialTieBreaker ) - { - this.compareId = entityIdIsSpecialTieBreaker; - } - - @Override - public boolean getCompareId() - { - return compareId; - } - - @Override - public long getEntityId() - { - return entityId; - } - - @Override - public void setEntityId( long entityId ) - { - this.entityId = entityId; - } - - @Override - public void from( long entityId, Value... values ) + void from( Value... values ) { extractRawBits( assertValidValue( values ) ); - this.entityId = entityId; - compareId = false; - } - - @Override - public String propertiesAsString() - { - return asValue().toString(); } @Override @@ -102,32 +67,28 @@ public NumberValue asValue() } @Override - public void initAsLowest() + void initValueAsLowest() { double[] limit = new double[crs.getDimension()]; Arrays.fill(limit, Double.NEGATIVE_INFINITY); writePoint( limit ); - entityId = Long.MIN_VALUE; - compareId = true; } @Override - public void initAsHighest() + void initValueAsHighest() { // These coords will generate the largest value on the spacial curve double[] limit = new double[crs.getDimension()]; Arrays.fill(limit, Double.NEGATIVE_INFINITY); limit[0] = Double.POSITIVE_INFINITY; writePoint( limit ); - entityId = Long.MAX_VALUE; - compareId = true; } public void fromDerivedValue( long entityId, long derivedValue ) { rawValueBits = derivedValue; - this.entityId = entityId; - this.compareId = false; + setEntityId( entityId ); + setCompareId( DEFAULT_COMPARE_ID ); } /** @@ -175,6 +136,6 @@ private void writePoint( double[] coordinate ) @Override public String toString() { - return format( "rawValue=%d,value=%s,entityId=%d", rawValueBits, "unknown", entityId ); + return format( "rawValue=%d,value=%s,entityId=%d", rawValueBits, "unknown", getEntityId() ); } } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/StringSchemaKey.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/StringSchemaKey.java index 9c4c45268366d..435d09962bca5 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/StringSchemaKey.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/StringSchemaKey.java @@ -25,60 +25,31 @@ import org.neo4j.string.UTF8; import org.neo4j.values.storable.TextValue; import org.neo4j.values.storable.Value; -import org.neo4j.values.storable.ValueWriter; import org.neo4j.values.storable.Values; import static java.lang.String.format; - import static org.neo4j.values.storable.UTF8StringValue.codePointByteArrayCompare; /** * Includes value and entity id (to be able to handle non-unique values). A value can be any {@link String}, * or rather any string that {@link GBPTree} can handle. */ -class StringSchemaKey extends ValueWriter.Adapter implements NativeSchemaKey +class StringSchemaKey extends NativeSchemaKey { static final int ENTITY_ID_SIZE = Long.BYTES; - private long entityId; - private boolean compareId; - // TODO something better or? // TODO this is UTF-8 bytes for now byte[] bytes; - public void setCompareId( boolean compareId ) - { - this.compareId = compareId; - } - - public boolean getCompareId() - { - return compareId; - } - int size() { return ENTITY_ID_SIZE + bytes.length; } @Override - public long getEntityId() - { - return entityId; - } - - @Override - public void setEntityId( long entityId ) - { - this.entityId = entityId; - } - - @Override - public void from( long entityId, Value... values ) + void from( Value... values ) { - this.entityId = entityId; - compareId = false; assertValidValue( values ).writeTo( this ); } @@ -100,38 +71,27 @@ private TextValue assertValidValue( Value... values ) return (TextValue) values[0]; } - @Override - public String propertiesAsString() - { - return asValue().toString(); - } - @Override public Value asValue() { return bytes == null ? Values.NO_VALUE : Values.utf8Value( bytes ); } - // TODO perhaps merge these lowest/highest methods into parent @Override - public void initAsLowest() + void initValueAsLowest() { bytes = null; - entityId = Long.MIN_VALUE; - compareId = true; } @Override - public void initAsHighest() + void initValueAsHighest() { bytes = null; - entityId = Long.MAX_VALUE; - compareId = true; } private boolean isHighest() { - return compareId && entityId == Long.MAX_VALUE && bytes == null; + return getCompareId() && getEntityId() == Long.MAX_VALUE && bytes == null; } /** @@ -198,7 +158,7 @@ private static int byteArrayCompare( byte[] a, byte[] b ) @Override public String toString() { - return format( "value=%s,entityId=%d,bytes=%s", asValue(), entityId, Arrays.toString( bytes ) ); + return format( "value=%s,entityId=%d,bytes=%s", asValue(), getEntityId(), Arrays.toString( bytes ) ); } @Override