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);
}
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)));
}
}
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();
}
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);
}
Aggregations