Search in sources :

Example 11 with InputPosition

use of org.neo4j.graphdb.InputPosition in project neo4j by neo4j.

the class ExecutionResultSerializerTest method shouldReturnNotifications.

@Test
public void shouldReturnNotifications() throws IOException {
    // given
    ByteArrayOutputStream output = new ByteArrayOutputStream();
    ExecutionResultSerializer serializer = getSerializerWith(output);
    Notification notification = NotificationCode.CARTESIAN_PRODUCT.notification(new InputPosition(1, 2, 3));
    List<Notification> notifications = Arrays.asList(notification);
    Result executionResult = mockExecutionResult(null, notifications, map("column1", "value1", "column2", "value2"));
    // when
    serializer.transactionCommitUri(URI.create("commit/uri/1"));
    serializer.statementResult(executionResult, false);
    serializer.notifications(notifications);
    serializer.finish();
    // then
    String result = output.toString(UTF_8.name());
    assertEquals("{\"commit\":\"commit/uri/1\",\"results\":[{\"columns\":[\"column1\",\"column2\"]," + "\"data\":[{\"row\":[\"value1\",\"value2\"],\"meta\":[null,null]}]}],\"notifications\":[{\"code\":\"Neo" + ".ClientNotification.Statement.CartesianProductWarning\",\"severity\":\"WARNING\",\"title\":\"This " + "query builds a cartesian product between disconnected patterns.\",\"description\":\"If a " + "part of a query contains multiple disconnected patterns, this will build a cartesian product" + " between all those parts. This may produce a large amount of data and slow down query " + "processing. While occasionally intended, it may often be possible to reformulate the query " + "that avoids the use of this cross product, perhaps by adding a relationship between the " + "different parts or by using OPTIONAL MATCH\",\"position\":{\"offset\":1,\"line\":2," + "\"column\":3}}],\"errors\":[]}", result);
}
Also used : InputPosition(org.neo4j.graphdb.InputPosition) ByteArrayOutputStream(java.io.ByteArrayOutputStream) Notification(org.neo4j.graphdb.Notification) Result(org.neo4j.graphdb.Result) Test(org.junit.Test) Neo4jJsonCodecTest(org.neo4j.server.rest.transactional.Neo4jJsonCodecTest)

Example 12 with InputPosition

use of org.neo4j.graphdb.InputPosition in project neo4j by neo4j.

the class NotificationAcceptanceTest method shouldGiveCorrectPositionWhetherFromCacheOrNot.

@Test
void shouldGiveCorrectPositionWhetherFromCacheOrNot() {
    // Given
    String cachedQuery = "MATCH (a:L1) RETURN a";
    String nonCachedQuery = "MATCH (a:L2) RETURN a";
    // make sure we cache the query
    int limit = db.getDependencyResolver().resolveDependency(Config.class).get(GraphDatabaseInternalSettings.cypher_expression_recompilation_limit);
    try (Transaction transaction = db.beginTx()) {
        for (int i = 0; i < limit + 1; i++) {
            transaction.execute(cachedQuery).resultAsString();
        }
        transaction.commit();
    }
    // When
    try (Transaction transaction = db.beginTx()) {
        Notification cachedNotification = Iterables.asList(transaction.execute("EXPLAIN " + cachedQuery).getNotifications()).get(0);
        Notification nonCachedNotication = Iterables.asList(transaction.execute("EXPLAIN " + nonCachedQuery).getNotifications()).get(0);
        // Then
        assertThat(cachedNotification.getPosition(), equalTo(new InputPosition(17, 1, 18)));
        assertThat(nonCachedNotication.getPosition(), equalTo(new InputPosition(17, 1, 18)));
    }
}
Also used : InputPosition(org.neo4j.graphdb.InputPosition) Transaction(org.neo4j.graphdb.Transaction) Config(org.neo4j.configuration.Config) Matchers.containsString(org.hamcrest.Matchers.containsString) Notification(org.neo4j.graphdb.Notification) Test(org.junit.jupiter.api.Test)

Example 13 with InputPosition

use of org.neo4j.graphdb.InputPosition in project neo4j by neo4j.

the class AbstractCypherAdapterStream method convertNotifications.

private static AnyValue convertNotifications(Iterable<Notification> notifications) {
    ListValueBuilder listValueBuilder = ListValueBuilder.newListBuilder();
    for (Notification notification : notifications) {
        // position is optional
        InputPosition pos = notification.getPosition();
        boolean includePosition = !pos.equals(InputPosition.empty);
        int size = includePosition ? 5 : 4;
        MapValueBuilder builder = new MapValueBuilder(size);
        builder.add("code", utf8Value(notification.getCode()));
        builder.add("title", utf8Value(notification.getTitle()));
        builder.add("description", utf8Value(notification.getDescription()));
        builder.add("severity", utf8Value(notification.getSeverity().toString()));
        if (includePosition) {
            // only add the position if it is not empty
            builder.add("position", VirtualValues.map(new String[] { "offset", "line", "column" }, new AnyValue[] { intValue(pos.getOffset()), intValue(pos.getLine()), intValue(pos.getColumn()) }));
        }
        listValueBuilder.add(builder.build());
    }
    return listValueBuilder.build();
}
Also used : MapValueBuilder(org.neo4j.values.virtual.MapValueBuilder) InputPosition(org.neo4j.graphdb.InputPosition) AnyValue(org.neo4j.values.AnyValue) Notification(org.neo4j.graphdb.Notification) ListValueBuilder(org.neo4j.values.virtual.ListValueBuilder)

Example 14 with InputPosition

use of org.neo4j.graphdb.InputPosition in project neo4j by neo4j.

the class LineDelimitedEventSourceJoltSerializerTest method shouldReturnNotifications.

@Test
void shouldReturnNotifications() {
    // given
    Notification notification = NotificationCode.CARTESIAN_PRODUCT.notification(new InputPosition(1, 2, 3));
    List<Notification> notifications = Collections.singletonList(notification);
    var row = Map.of("column1", "value1", "column2", "value2");
    // when
    writeStatementStart(serializer, "column1", "column2");
    writeRecord(serializer, row, "column1", "column2");
    writeStatementEnd(serializer, null, notifications);
    writeTransactionInfo(serializer, "commit/uri/1");
    // then
    String result = output.toString(UTF_8);
    assertEquals("{\"header\":{\"fields\":[\"column1\",\"column2\"]}}\n" + "{\"data\":[{\"U\":\"value1\"},{\"U\":\"value2\"}]}\n" + "{\"summary\":{}}\n" + "{\"info\":{\"notifications\":[{\"code\":\"Neo.ClientNotification.Statement.CartesianProductWarning\"," + "\"severity\":\"WARNING\"," + "\"title\":\"This query builds a cartesian product between disconnected patterns.\"," + "\"description\":\"If a part of a query contains multiple disconnected patterns, this will build a cartesian " + "product between all those parts. This may produce a large amount of data and slow down query " + "processing. While occasionally intended, it may often be possible to reformulate the query " + "that avoids the use of this cross product, perhaps by adding a relationship between the " + "different parts or by using OPTIONAL MATCH\"," + "\"position\":{\"offset\":1,\"line\":2,\"column\":3}}]," + "\"commit\":\"commit/uri/1\"}}\n", result);
}
Also used : InputPosition(org.neo4j.graphdb.InputPosition) Notification(org.neo4j.graphdb.Notification) Test(org.junit.jupiter.api.Test)

Aggregations

InputPosition (org.neo4j.graphdb.InputPosition)14 Test (org.junit.Test)6 Result (org.neo4j.graphdb.Result)6 Notification (org.neo4j.graphdb.Notification)5 Test (org.junit.jupiter.api.Test)4 Map (java.util.Map)2 QueryStatistics (org.neo4j.graphdb.QueryStatistics)2 ByteArrayOutputStream (java.io.ByteArrayOutputStream)1 Matchers.containsString (org.hamcrest.Matchers.containsString)1 ParameterizedTest (org.junit.jupiter.params.ParameterizedTest)1 MethodSource (org.junit.jupiter.params.provider.MethodSource)1 BoltAdapterSubscriber (org.neo4j.bolt.runtime.statemachine.impl.BoltAdapterSubscriber)1 TestNotification (org.neo4j.bolt.testing.TestNotification)1 BoltResult (org.neo4j.bolt.v1.runtime.spi.BoltResult)1 Config (org.neo4j.configuration.Config)1 Transaction (org.neo4j.graphdb.Transaction)1 QueryExecution (org.neo4j.kernel.impl.query.QueryExecution)1 TransactionalContext (org.neo4j.kernel.impl.query.TransactionalContext)1 Neo4jJsonCodecTest (org.neo4j.server.rest.transactional.Neo4jJsonCodecTest)1 AnyValue (org.neo4j.values.AnyValue)1