private void executeInThread( final String query, Map<String,Object> params ) { executorService.execute( () -> { try { db.execute( query, params ).resultAsString(); } catch ( Exception e ) { hasFailed.set( true ); } } ); } }
@SuppressWarnings( "unchecked" ) @Test public void shouldNotReturnInternalPointWhenInArray() { // when Result execute = graphDb.execute( "RETURN [point({longitude: 144.317718, latitude: -37.031738})] AS ps" ); // then List<Point> points = (List<Point>)execute.next().get( "ps" ); assertThat( points.get(0), Matchers.instanceOf(Point.class)); }
@SuppressWarnings( "unchecked" ) @Test public void shouldNotReturnInternalPointWhenInMap() { // when Result execute = graphDb.execute( "RETURN {p: point({longitude: 144.317718, latitude: -37.031738})} AS m" ); // then Map<String,Object> points = (Map<String, Object>)execute.next().get( "m" ); assertThat( points.get("p"), Matchers.instanceOf(Point.class)); }
private void createData( long startingUserId, int numUsers, int numConnections ) { for ( long userId = startingUserId; userId < numUsers + startingUserId; userId++ ) { db.execute( "CREATE (newUser:User {userId: {userId}})", singletonMap( "userId", userId ) ); } Map<String,Object> params = new HashMap<>(); for ( int i = 0; i < numConnections; i++ ) { long user1 = startingUserId + randomInt( numUsers ); long user2; do { user2 = startingUserId + randomInt( numUsers ); } while ( user1 == user2 ); params.put( "user1", user1 ); params.put( "user2", user2 ); db.execute( "MATCH (user1:User { userId: {user1} }), (user2:User { userId: {user2} }) " + "MERGE (user1) -[:FRIEND]- (user2)", params ); } }
@Test public void shouldHandleConcurrentIndexCreationAndUsage() throws InterruptedException { // Given HashMap<String,Object> params = new HashMap<>(); params.put( "param", NUM_PROPS ); db.execute( "FOREACH(x in range(0,$param) | CREATE (:A {prop:x})) ", params ); db.execute( "CREATE INDEX ON :A(prop) " ); // When for ( int i = 0; i < NUM_PROPS; i++ ) { params.put( "param", i ); executeInThread( "MATCH (n:A) WHERE n.prop CONTAINS 'A' RETURN n.prop", params ); } // Then awaitAndAssertNoErrors(); }
@Test public void shouldBeAbleToUseResultingPointFromOneQueryAsParameterToNext() { // given a point create by one cypher query Result execute = graphDb.execute( "RETURN point({longitude: 144.317718, latitude: -37.031738}) AS p" ); Point point = (Point) execute.next().get( "p" ); // when passing as params to a distance function Result result = graphDb.execute( "RETURN distance(point({longitude: 144.317718, latitude: -37.031738}),{previous}) AS dist", map( "previous", point ) ); // then Double dist = (Double) result.next().get( "dist" ); assertThat( dist, equalTo( 0.0 ) ); }
@Test public void shouldNotReturnInternalCartesianPointType() { // when Result execute = graphDb.execute( "RETURN point({x: 13.37, y: 13.37, crs:'cartesian'}) AS p" ); // then Object obj = execute.next().get( "p" ); assertThat( obj, Matchers.instanceOf(Point.class)); Point point = (Point) obj; assertThat( point.getCoordinate(), equalTo(new Coordinate( 13.37, 13.37 ))); CRS crs = point.getCRS(); assertThat( crs.getCode(), equalTo(7203)); assertThat( crs.getType(), equalTo("cartesian")); assertThat( crs.getHref(), equalTo("http://spatialreference.org/ref/sr-org/7203/")); }
private void executeDistantFriendsCountQuery( int userId ) { Map<String,Object> params = singletonMap( "userId", (long) randomInt( userId ) ); try ( Result result = db.execute( "MATCH (user:User { userId: {userId} } ) -[:FRIEND]- () -[:FRIEND]- (distantFriend) " + "RETURN COUNT(distinct distantFriend)", params ) ) { while ( result.hasNext() ) { result.next(); } } }
@Test public void shouldNotReturnInternalGeographicPointType() { // when Result execute = graphDb.execute( "RETURN point({longitude: 144.317718, latitude: -37.031738}) AS p" ); // then Object obj = execute.next().get( "p" ); assertThat( obj, Matchers.instanceOf(Point.class)); Point point = (Point) obj; assertThat( point.getCoordinate().getCoordinate().get(0), equalTo( 144.317718 )); assertThat( point.getCoordinate().getCoordinate().get(1), equalTo( -37.031738 )); CRS crs = point.getCRS(); assertThat( crs.getCode(), equalTo(4326)); assertThat( crs.getType(), equalTo("wgs-84")); assertThat( crs.getHref(), equalTo("http://spatialreference.org/ref/epsg/4326/")); }
@Test public void shouldBeAbleToUseExternalPointAsParameterToQuery() { // given a point created from public interface Point point = makeFakePoint( 144.317718, -37.031738, makeWGS84() ); // when passing as params to a distance function Result result = graphDb.execute( "RETURN distance(point({longitude: 144.317718, latitude: -37.031738}),{previous}) AS dist", map( "previous", point ) ); // then Double dist = (Double) result.next().get( "dist" ); assertThat( dist, equalTo( 0.0 ) ); }
@Test public void shouldBeAbleToUseExternalGeometryAsParameterToQuery() { // given a point created from public interface Geometry geometry = makeFakePointAsGeometry( 144.317718, -37.031738, makeWGS84() ); // when passing as params to a distance function Result result = graphDb.execute( "RETURN distance(point({longitude: 144.317718, latitude: -37.031738}),{previous}) AS dist", map( "previous", geometry ) ); // then Double dist = (Double) result.next().get( "dist" ); assertThat( dist, equalTo( 0.0 ) ); }
@Test public void shouldBeAbleToUseExternalPointArrayAsParameterToQuery() { // given a point created from public interface Point point = makeFakePoint( 144.317718, -37.031738, makeWGS84() ); Point[] points = new Point[]{point, point}; // when passing as params to a distance function Result result = graphDb.execute( "RETURN distance({points}[0],{points}[1]) AS dist", map( "points", points ) ); // then Double dist = (Double) result.next().get( "dist" ); assertThat( dist, equalTo( 0.0 ) ); }
@Test public void shouldBeAbleToUseResultsOfPointProcedureAsInputToDistanceFunction() throws Exception { // given procedure that produces a point Procedures procedures = graphDb.getDependencyResolver().resolveDependency( Procedures.class ); procedures.registerProcedure( PointProcs.class ); // when calling procedure that produces a point Result result = graphDb.execute( "CALL spatial.point(144.317718, -37.031738) YIELD point " + "RETURN distance(point({longitude: 144.317718, latitude: -37.031738}), point) AS dist" ); // then Double dist = (Double) result.next().get( "dist" ); assertThat( dist, equalTo( 0.0 ) ); }
@Test public void shouldBeAbleToUseResultsOfPointGeometryProcedureAsInputToDistanceFunction() throws Exception { // given procedure that produces a point Procedures procedures = graphDb.getDependencyResolver().resolveDependency( Procedures.class ); procedures.registerProcedure( PointProcs.class ); // when calling procedure that produces a point Result result = graphDb.execute( "CALL spatial.pointGeometry(144.317718, -37.031738) YIELD geometry " + "RETURN distance(point({longitude: 144.317718, latitude: -37.031738}), geometry) AS dist" ); // then Object dist1 = result.next().get( "dist" ); Double dist = (Double) dist1; assertThat( dist, equalTo( 0.0 ) ); }
@Test public void labelledNodesCypherCurrent() throws Throwable { String[] entityTokens = {LABEL.name()}; SchemaDescriptor descriptor = getExistingDescriptor( entityTokens ); SchemaDescriptor newDescriptor = getNewDescriptor( entityTokens ); IndexReference initialIndex = createInitialIndex( descriptor ); Runnable aliceWork = work( nodesCreatedPerThread, () -> { db.execute( "create (:LABEL {" + PROP + ": \"alice\"})" ).close(); aliceLatch.countDown(); } ); Runnable bobWork = work( nodesCreatedPerThread, () -> { db.execute( "create (:LABEL {otherProp: \"bob\"})" ).close(); bobLatch.countDown(); } ); Runnable changeConfig = work( 1, dropAndReCreateIndex( initialIndex, newDescriptor ) ); raceContestantsAndVerifyResults( newDescriptor, aliceWork, changeConfig, bobWork ); }
@Test public void labelledNodesCypherRule() throws Throwable { String[] entityTokens = {LABEL.name()}; SchemaDescriptor descriptor = getExistingDescriptor( entityTokens ); SchemaDescriptor newDescriptor = getNewDescriptor( entityTokens ); IndexReference initialIndex = createInitialIndex( descriptor ); Runnable aliceWork = work( nodesCreatedPerThread, () -> { db.execute( "CYPHER planner=rule create (:LABEL {" + PROP + ": \"alice\"})" ).close(); aliceLatch.countDown(); } ); Runnable bobWork = work( nodesCreatedPerThread, () -> { db.execute( "CYPHER planner=rule create (:LABEL {otherProp: \"bob\"})" ).close(); bobLatch.countDown(); } ); Runnable changeConfig = work( 1, dropAndReCreateIndex( initialIndex, newDescriptor ) ); raceContestantsAndVerifyResults( newDescriptor, aliceWork, changeConfig, bobWork ); } }
@Test public void labelledNodesCypher31() throws Throwable { String[] entityTokens = {LABEL.name()}; SchemaDescriptor descriptor = getExistingDescriptor( entityTokens ); SchemaDescriptor newDescriptor = getNewDescriptor( entityTokens ); IndexReference initialIndex = createInitialIndex( descriptor ); Runnable aliceWork = work( nodesCreatedPerThread, () -> { db.execute( "CYPHER 3.1 create (:LABEL {" + PROP + ": \"alice\"})" ).close(); aliceLatch.countDown(); } ); Runnable bobWork = work( nodesCreatedPerThread, () -> { db.execute( "CYPHER 3.1 create (:LABEL {otherProp: \"bob\"})" ).close(); bobLatch.countDown(); } ); Runnable changeConfig = work( 1, dropAndReCreateIndex( initialIndex, newDescriptor ) ); raceContestantsAndVerifyResults( newDescriptor, aliceWork, changeConfig, bobWork ); }
@Test public void labelledNodesCypher23() throws Throwable { String[] entityTokens = {LABEL.name()}; SchemaDescriptor descriptor = getExistingDescriptor( entityTokens ); SchemaDescriptor newDescriptor = getNewDescriptor( entityTokens ); IndexReference initialIndex = createInitialIndex( descriptor ); Runnable aliceWork = work( nodesCreatedPerThread, () -> { db.execute( "CYPHER 2.3 create (:LABEL {" + PROP + ": \"alice\"})" ).close(); aliceLatch.countDown(); } ); Runnable bobWork = work( nodesCreatedPerThread, () -> { db.execute( "CYPHER 2.3 create (:LABEL {otherProp: \"bob\"})" ).close(); bobLatch.countDown(); } ); Runnable changeConfig = work( 1, dropAndReCreateIndex( initialIndex, newDescriptor ) ); raceContestantsAndVerifyResults( newDescriptor, aliceWork, changeConfig, bobWork ); }
@Test public void shouldExecuteCypher() { // given final long before; final long after; try ( Transaction tx = graphDb.beginTx() ) { before = Iterables.count( graphDb.getAllNodes() ); tx.success(); } // when graphDb.execute( "CREATE (n:Foo{bar:\"baz\"})" ); // then try ( Transaction tx = graphDb.beginTx() ) { after = Iterables.count( graphDb.getAllNodes() ); tx.success(); } assertEquals( before + 1, after ); }