use of org.neo4j.server.http.cypher.format.api.Statement in project neo4j by neo4j.
the class InvocationTest method shouldHandleConnectionErrorWhenWritingOutputInImplicitTransaction.
@Test
void shouldHandleConnectionErrorWhenWritingOutputInImplicitTransaction() {
// given
when(internalTransaction.execute("query", emptyMap())).thenReturn(executionResult);
when(registry.begin(any(TransactionHandle.class))).thenReturn(1337L);
TransactionHandle handle = getTransactionHandle(executionEngine, registry);
InputEventStream inputEventStream = mock(InputEventStream.class);
Statement statement = new Statement("query", map());
when(inputEventStream.read()).thenReturn(statement, NULL_STATEMENT);
mockDefaultResult();
Invocation invocation = new Invocation(log, handle, uriScheme.txCommitUri(1337L), mock(MemoryPool.class, RETURNS_MOCKS), inputEventStream, true);
doThrow(new ConnectionException("Connection error", new IOException("Broken pipe"))).when(outputEventStream).writeStatementEnd(any(), any(), any(), any());
// when
var e = assertThrows(ConnectionException.class, () -> invocation.execute(outputEventStream));
assertEquals("Connection error", e.getMessage());
// then
verify(internalTransaction).rollback();
verify(registry).forget(1337L);
InOrder outputOrder = inOrder(outputEventStream);
outputOrder.verify(outputEventStream).writeStatementStart(statement, List.of("c1", "c2", "c3"));
verifyDefaultResultRows(outputOrder);
outputOrder.verify(outputEventStream).writeStatementEnd(queryExecutionType, queryStatistics, executionPlanDescription, notifications);
verifyNoMoreInteractions(outputEventStream);
}
use of org.neo4j.server.http.cypher.format.api.Statement in project neo4j by neo4j.
the class InvocationTest method shouldHandleRollbackError.
@Test
void shouldHandleRollbackError() {
// given
when(internalTransaction.execute("query", emptyMap())).thenThrow(new RuntimeException("BOO"));
doThrow(new IllegalStateException("Something went wrong")).when(internalTransaction).rollback();
when(registry.begin(any(TransactionHandle.class))).thenReturn(1337L);
TransactionHandle handle = getTransactionHandle(executionEngine, registry);
InputEventStream inputEventStream = mock(InputEventStream.class);
Statement statement = new Statement("query", map());
when(inputEventStream.read()).thenReturn(statement, NULL_STATEMENT);
Invocation invocation = new Invocation(log, handle, uriScheme.txCommitUri(1337L), mock(MemoryPool.class, RETURNS_MOCKS), inputEventStream, true);
// when
invocation.execute(outputEventStream);
// then
verify(internalTransaction).execute("query", emptyMap());
verify(log).error(eq("Failed to roll back transaction."), any(IllegalStateException.class));
verify(registry).forget(1337L);
InOrder outputOrder = inOrder(outputEventStream);
outputOrder.verify(outputEventStream).writeFailure(Status.Statement.ExecutionFailed, "BOO");
outputOrder.verify(outputEventStream).writeFailure(Status.Transaction.TransactionRollbackFailed, "Something went wrong");
outputOrder.verify(outputEventStream).writeTransactionInfo(TransactionNotificationState.UNKNOWN, uriScheme.txCommitUri(1337L), -1);
verifyNoMoreInteractions(outputEventStream);
}
use of org.neo4j.server.http.cypher.format.api.Statement in project neo4j by neo4j.
the class Invocation method executeStatements.
private void executeStatements() {
try {
while (outputError == null) {
memoryPool.reserveHeap(Statement.SHALLOW_SIZE);
try {
Statement statement = readStatement();
if (statement == null) {
return;
}
executeStatement(statement);
} finally {
memoryPool.releaseHeap(Statement.SHALLOW_SIZE);
}
}
} catch (InputFormatException e) {
handleNeo4jError(Status.Request.InvalidFormat, e);
} catch (KernelException | Neo4jException | AuthorizationViolationException | WriteOperationsNotAllowedException e) {
handleNeo4jError(e.status(), e);
} catch (DeadlockDetectedException e) {
handleNeo4jError(Status.Transaction.DeadlockDetected, e);
} catch (Exception e) {
Throwable cause = e.getCause();
if (cause instanceof Status.HasStatus) {
handleNeo4jError(((Status.HasStatus) cause).status(), cause);
} else {
handleNeo4jError(Status.Statement.ExecutionFailed, e);
}
}
}
use of org.neo4j.server.http.cypher.format.api.Statement in project neo4j by neo4j.
the class JsonMessageBodyReader method readFrom.
@Override
public InputEventStream readFrom(Class<InputEventStream> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, String> httpHeaders, InputStream entityStream) throws WebApplicationException {
Map<Statement, InputStatement> inputStatements = new HashMap<>();
Map<String, Object> parameters = new HashMap<>();
parameters.put(STATEMENTS_KEY, inputStatements);
StatementDeserializer statementDeserializer = new StatementDeserializer(this.jsonFactory, entityStream);
return new InputEventStream(parameters, () -> {
InputStatement inputStatement = statementDeserializer.read();
if (inputStatement == null) {
return null;
}
Statement statement = new Statement(inputStatement.statement(), inputStatement.parameters());
inputStatements.put(statement, inputStatement);
return statement;
});
}
use of org.neo4j.server.http.cypher.format.api.Statement in project neo4j by neo4j.
the class InvocationTest method shouldResumeTransactionWhenExecutingStatementsOnSecondRequest.
@Test
void shouldResumeTransactionWhenExecutingStatementsOnSecondRequest() {
// given
when(internalTransaction.execute("query", emptyMap())).thenReturn(executionResult);
when(registry.begin(any(TransactionHandle.class))).thenReturn(1337L);
TransactionHandle handle = getTransactionHandle(executionEngine, registry);
InputEventStream inputEventStream = mock(InputEventStream.class);
Statement statement = new Statement("query", map());
when(inputEventStream.read()).thenReturn(statement, NULL_STATEMENT);
mockDefaultResult();
Invocation invocation = new Invocation(log, handle, uriScheme.txCommitUri(1337L), mock(MemoryPool.class, RETURNS_MOCKS), inputEventStream, false);
invocation.execute(outputEventStream);
reset(transactionContext, registry, internalTransaction, outputEventStream);
when(inputEventStream.read()).thenReturn(statement, NULL_STATEMENT);
when(internalTransaction.execute("query", emptyMap())).thenReturn(executionResult);
// when
invocation.execute(outputEventStream);
// then
InOrder order = inOrder(transactionContext, registry, internalTransaction);
order.verify(internalTransaction).execute("query", emptyMap());
order.verify(registry).release(1337L, handle);
InOrder outputOrder = inOrder(outputEventStream);
outputOrder.verify(outputEventStream).writeStatementStart(statement, List.of("c1", "c2", "c3"));
verifyDefaultResultRows(outputOrder);
outputOrder.verify(outputEventStream).writeStatementEnd(queryExecutionType, queryStatistics, executionPlanDescription, notifications);
outputOrder.verify(outputEventStream).writeTransactionInfo(TransactionNotificationState.OPEN, uriScheme.txCommitUri(1337L), 0);
verifyNoMoreInteractions(outputEventStream);
}
Aggregations