Skip to content

Commit

Permalink
First part of feedback
Browse files Browse the repository at this point in the history
  • Loading branch information
SaschaPeukert committed Jul 26, 2018
1 parent 6f9d862 commit a924bbd
Show file tree
Hide file tree
Showing 7 changed files with 176 additions and 23 deletions.
Expand Up @@ -33,13 +33,20 @@ class NodeData

NodeData( long id, long[] labels, Map<Integer,Value> properties )
{
if ( labels == null )
{
throw new IllegalArgumentException();
}

this.id = id;
this.labels = labels;
Arrays.sort( labels ); // needed for quick equality check, most of the time, its already sorted anyway
this.properties = properties;
}

LabelSet labelSet()
{

return new LabelSet()
{
@Override
Expand All @@ -51,7 +58,7 @@ public int numberOfLabels()
@Override
public int label( int offset )
{
return labels.length;
return (int) labels[offset];
}

@Override
Expand Down Expand Up @@ -84,7 +91,18 @@ public boolean equals( Object obj )
{
if ( obj instanceof LabelSet )
{
return Arrays.equals( labels, ((LabelSet) obj).all() );
long[] input = ((LabelSet) obj).all();

if ( labels == input )
{
return true;
}
if ( input.length != labels.length )
{
return false;
}

return Arrays.equals( labels, input );
}
return false;
}
Expand Down
@@ -0,0 +1,66 @@
/*
* Copyright (c) 2002-2018 "Neo4j,"
* Neo4j Sweden AB [http://neo4j.com]
*
* This file is part of Neo4j.
*
* Neo4j is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.neo4j.internal.kernel.api.helpers;

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;

class NodeDataTest
{
@Test
void testEqualityOfLabelSets()
{
long[] longsA = new long[]{1L,2L,3L};
long[] longsB = new long[]{3L,2L,1L};
long[] longsC = new long[]{1L,2L,3L,4L};
NodeData a = new NodeData( 1, longsA, null );
NodeData b = new NodeData( 1, longsB, null );
NodeData c = new NodeData( 1, longsC, null );

// self
assertTrue(a.labelSet().equals( a.labelSet() ));

// unordered self
assertTrue(a.labelSet().equals( b.labelSet() ));
assertTrue(b.labelSet().equals( a.labelSet() ));

// other
assertFalse(a.labelSet().equals( c.labelSet() ));
assertFalse(c.labelSet().equals( a.labelSet() ));
}

@Test
void testHashCodeOfLabelSet()
{
long[] longsA = new long[]{1L,2L,3L};
long[] longsB = new long[]{3L,2L,1L};
long[] longsC = new long[]{1L,2L,3L,4L};
NodeData a = new NodeData( 1, longsA, null );
NodeData b = new NodeData( 1, longsB, null );
NodeData c = new NodeData( 1, longsC, null );

assertEquals( a.labelSet().hashCode(), b.labelSet().hashCode() );
assertNotEquals( a.labelSet().hashCode(), c.labelSet().hashCode() );
}
}
Expand Up @@ -194,21 +194,13 @@ public void resampleOutdatedIndexes()
}
}

@Procedure( name = "db.schemaAsTable", mode = Mode.READ ) // I am open about a better name for this. Something like db.propertySchema maybe?
@Description( "Show the schema of the data in tabular form." )
public Stream<SchemaInfoResult> schemaAsTable()
@Procedure( name = "db.propertySchema", mode = Mode.READ )
@Description( "Show the derived property schema of the data in tabular form." )
public Stream<SchemaInfoResult> propertySchema()
{
return new SchemaCalculator( tx ).calculateTabularResultStream();
}

// TODO: Next step -> graph with more info then db.schema currently has
// @Procedure( value = "db.schema.graph", mode = Mode.READ )
// @Description( "Show the schema of the data." ) // old description
// public Stream<SchemaProcedure.GraphResult> schemaAsGraph()
// {
// return new SchemaCalculator( db, tx ).calculateGraphResultStream();
// }

@Description( "Show the schema of the data." )
@Procedure( name = "db.schema", mode = READ )
public Stream<SchemaProcedure.GraphResult> metaGraph()
Expand Down
Expand Up @@ -69,8 +69,6 @@ public class SchemaCalculator
private final String NODE = "Node";
private final String RELATIONSHIP = "Relationship";

//TODO: Extend this to support showing how relationships types connect to nodes

SchemaCalculator( KernelTransaction ktx )
{
this.ktx = ktx;
Expand Down
Expand Up @@ -36,6 +36,7 @@ public class Labels implements LabelSet
private Labels( long[] labels )
{
this.labels = labels;
Arrays.sort(labels); // needed for quick equality check, most of the time, its already sorted anyway
}

public static Labels from( long[] labels )
Expand Down Expand Up @@ -100,7 +101,18 @@ public boolean equals( Object obj )
{
if ( obj instanceof LabelSet )
{
return Arrays.equals( labels, ((LabelSet) obj).all() );
long[] input = ((LabelSet) obj).all();

if ( labels == input )
{
return true;
}
if ( input.length != labels.length )
{
return false;
}

return Arrays.equals(labels, input);
}
return false;
}
Expand Down
Expand Up @@ -80,7 +80,7 @@ public void testSchemaTableWithNodes() throws Throwable

// When
RawIterator<Object[],ProcedureException> stream =
procs().procedureCallRead( procs().procedureGet( procedureName( "db", "schemaAsTable" ) ).id(), new Object[0] );
procs().procedureCallRead( procs().procedureGet( procedureName( "db", "propertySchema" ) ).id(), new Object[0] );

// Then
assertThat( asList( stream ), containsInAnyOrder(
Expand Down Expand Up @@ -115,7 +115,7 @@ public void testSchemaTableWithSimilarNodes() throws Throwable

// When
RawIterator<Object[],ProcedureException> stream =
procs().procedureCallRead( procs().procedureGet( procedureName( "db", "schemaAsTable" ) ).id(), new Object[0] );
procs().procedureCallRead( procs().procedureGet( procedureName( "db", "propertySchema" ) ).id(), new Object[0] );

// Then
assertThat( asList( stream ), contains(
Expand Down Expand Up @@ -151,7 +151,7 @@ public void testSchemaTableWithSimilarNodesHavingDifferentPropertyValueTypes() t

// When
RawIterator<Object[],ProcedureException> stream =
procs().procedureCallRead( procs().procedureGet( procedureName( "db", "schemaAsTable" ) ).id(), new Object[0] );
procs().procedureCallRead( procs().procedureGet( procedureName( "db", "propertySchema" ) ).id(), new Object[0] );

// Then
assertThat( asList( stream ), containsInAnyOrder(
Expand Down Expand Up @@ -190,7 +190,7 @@ public void testSchemaTableWithRelationships() throws Throwable

// When
RawIterator<Object[],ProcedureException> stream =
procs().procedureCallRead( procs().procedureGet( procedureName( "db", "schemaAsTable" ) ).id(), new Object[0] );
procs().procedureCallRead( procs().procedureGet( procedureName( "db", "propertySchema" ) ).id(), new Object[0] );

// Then
assertThat( asList( stream ), containsInAnyOrder( equalTo( new Object[]{"Relationship", Arrays.asList( "R" ), "prop1", "STRING"} ),
Expand Down Expand Up @@ -224,7 +224,7 @@ public void testSchemaTableWithSimilarRelationships() throws Throwable

// When
RawIterator<Object[],ProcedureException> stream =
procs().procedureCallRead( procs().procedureGet( procedureName( "db", "schemaAsTable" ) ).id(), new Object[0] );
procs().procedureCallRead( procs().procedureGet( procedureName( "db", "propertySchema" ) ).id(), new Object[0] );

// Then
assertThat( asList( stream ), containsInAnyOrder(
Expand Down Expand Up @@ -264,7 +264,7 @@ public void testSchemaTableWithSimilarRelationshipsHavingDifferentPropertyValueT

// When
RawIterator<Object[],ProcedureException> stream =
procs().procedureCallRead( procs().procedureGet( procedureName( "db", "schemaAsTable" ) ).id(), new Object[0] );
procs().procedureCallRead( procs().procedureGet( procedureName( "db", "propertySchema" ) ).id(), new Object[0] );

// Then
assertThat( asList( stream ), containsInAnyOrder(
Expand Down Expand Up @@ -319,7 +319,7 @@ public void testSchemaTableWithNullableProperties() throws Throwable

// When
RawIterator<Object[],ProcedureException> stream =
procs().procedureCallRead( procs().procedureGet( procedureName( "db", "schemaAsTable" ) ).id(), new Object[0] );
procs().procedureCallRead( procs().procedureGet( procedureName( "db", "propertySchema" ) ).id(), new Object[0] );

// Then
assertThat( asList( stream ), containsInAnyOrder(
Expand Down
@@ -0,0 +1,67 @@
/*
* Copyright (c) 2002-2018 "Neo4j,"
* Neo4j Sweden AB [http://neo4j.com]
*
* This file is part of Neo4j.
*
* Neo4j is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.neo4j.kernel.impl.newapi;

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;

class LabelsTest
{
@Test
void testEquals()
{
long[] longsA = new long[]{1L, 2L, 3L};
long[] longsB = new long[]{3L, 2L, 1L};
long[] longsC = new long[]{1L, 2L, 3L, 4L};
Labels a = Labels.from( longsA );
Labels b = Labels.from( longsB );
Labels c = Labels.from( longsC );

// self
//noinspection EqualsWithItself
assertTrue( a.equals( a ) );

// unordered self
assertTrue( a.equals( b ) );
assertTrue( b.equals( a ) );

// other
assertFalse( a.equals( c ) );
assertFalse( c.equals( a ) );
}

@Test
void testHashCodeOfLabelSet()
{
long[] longsA = new long[]{1L,2L,3L};
long[] longsB = new long[]{3L,2L,1L};
long[] longsC = new long[]{1L,2L,3L,4L};
Labels a = Labels.from( longsA );
Labels b = Labels.from( longsB );
Labels c = Labels.from( longsC );

assertEquals( a.hashCode(), b.hashCode() );
assertNotEquals( a.hashCode(), c.hashCode() );
}
}

0 comments on commit a924bbd

Please sign in to comment.