use of org.neo4j.kernel.impl.query.QueryExecution in project neo4j by neo4j.
the class SnapshotExecutionEngine method executeWithRetries.
protected MaterialisedResult executeWithRetries(String query, TransactionalContext context, QueryExecutor executor) throws QueryExecutionKernelException {
VersionContext versionContext = getCursorContext(context);
MaterialisedResult materialisedResult;
int attempt = 0;
boolean dirtySnapshot;
do {
if (attempt == maxQueryExecutionAttempts) {
throw new QueryExecutionKernelException(new UnstableSnapshotException("Unable to get clean data snapshot for query '%s' after %d attempts.", query, attempt));
}
if (attempt > 0) {
context.executingQuery().onRetryAttempted();
}
attempt++;
versionContext.initRead();
materialisedResult = new MaterialisedResult();
QueryExecution queryExecution = executor.execute(materialisedResult);
materialisedResult.consumeAll(queryExecution);
// objects is guaranteed by schema and not by execution engine
if (context.transaction().kernelTransaction().isSchemaTransaction()) {
return materialisedResult;
}
dirtySnapshot = versionContext.isDirty();
if (isUnstableSnapshot(materialisedResult, dirtySnapshot)) {
throw new QueryExecutionKernelException(new UnstableSnapshotException("Unable to get clean data snapshot for query '%s' that performs updates.", query, attempt));
}
} while (dirtySnapshot);
return materialisedResult;
}
use of org.neo4j.kernel.impl.query.QueryExecution in project neo4j by neo4j.
the class SnapshotExecutionEngine method executeQuery.
@Override
public Result executeQuery(String query, MapValue parameters, TransactionalContext context, boolean prePopulate) throws QueryExecutionKernelException {
QueryExecutor queryExecutor = querySubscriber -> super.executeQuery(query, parameters, context, prePopulate, querySubscriber);
ResultSubscriber resultSubscriber = new ResultSubscriber(context);
MaterialisedResult materialisedResult = executeWithRetries(query, context, queryExecutor);
QueryExecution queryExecution = materialisedResult.stream(resultSubscriber);
resultSubscriber.init(queryExecution);
return resultSubscriber;
}
use of org.neo4j.kernel.impl.query.QueryExecution in project neo4j by neo4j.
the class SnapshotExecutionEngineTest method setUp.
@BeforeEach
void setUp() throws Exception {
transactionalContext = mock(TransactionalContext.class, RETURNS_DEEP_STUBS);
KernelStatement kernelStatement = mock(KernelStatement.class);
executor = mock(SnapshotExecutionEngine.QueryExecutor.class);
versionContext = mock(VersionContext.class);
statistics = mock(QueryStatistics.class);
executionEngine = new SnapshotExecutionEngine(new GraphDatabaseCypherService(db), config, TestExecutorCaffeineCacheFactory$.MODULE$, NullLogProvider.getInstance(), mock(CompilerFactory.class));
when(transactionalContext.kernelTransaction().cursorContext()).thenReturn(new CursorContext(NULL, versionContext));
when(transactionalContext.statement()).thenReturn(kernelStatement);
var innerExecution = mock(QueryExecution.class);
when(executor.execute(any())).thenAnswer((Answer<QueryExecution>) invocationOnMock -> {
MaterialisedResult materialisedResult = invocationOnMock.getArgument(0);
materialisedResult.onResultCompleted(statistics);
return innerExecution;
});
}
use of org.neo4j.kernel.impl.query.QueryExecution in project neo4j by neo4j.
the class AbstractCypherAdapterStreamTest method shouldIncludeProfileIfPresent.
@Test
void shouldIncludeProfileIfPresent() throws Throwable {
// Given
QueryStatistics queryStatistics = mock(QueryStatistics.class);
when(queryStatistics.containsUpdates()).thenReturn(false);
QueryExecution result = mock(QueryExecution.class);
BoltAdapterSubscriber subscriber = new BoltAdapterSubscriber();
when(result.fieldNames()).thenReturn(new String[0]);
when(result.executionType()).thenReturn(explained(READ_ONLY));
subscriber.onResultCompleted(queryStatistics);
when(result.getNotifications()).thenReturn(Collections.emptyList());
when(result.executionPlanDescription()).thenReturn(plan("Join", map("arg1", 1), 2, 4, 3, 1, 2, singletonList("id1"), plan("Scan", map("arg2", 1), 2, 4, 7, 1, 1, singletonList("id2"))));
var stream = new TestAbstractCypherAdapterStream(result, subscriber, Clock.systemUTC());
// When
MapValue meta = metadataOf(stream);
// Then
MapValue expectedChild = mapValues("args", mapValues("arg2", intValue(1)), "identifiers", list(stringValue("id2")), "operatorType", stringValue("Scan"), "children", VirtualValues.EMPTY_LIST, "rows", longValue(1L), "dbHits", longValue(2L), "pageCacheHits", longValue(4L), "pageCacheMisses", longValue(7L), "pageCacheHitRatio", doubleValue(4.0 / 11), "time", longValue(1));
MapValue expectedProfile = mapValues("args", mapValues("arg1", intValue(1)), "identifiers", list(stringValue("id1")), "operatorType", stringValue("Join"), "children", list(expectedChild), "rows", longValue(1L), "dbHits", longValue(2L), "pageCacheHits", longValue(4L), "pageCacheMisses", longValue(3L), "pageCacheHitRatio", doubleValue(4.0 / 7), "time", longValue(2));
assertMapEqualsWithDelta((MapValue) meta.get("profile"), expectedProfile, 0.0001);
}
use of org.neo4j.kernel.impl.query.QueryExecution in project neo4j by neo4j.
the class AbstractCypherAdapterStreamTest method shouldDiscardAllReadQuery.
@Test
void shouldDiscardAllReadQuery() throws Throwable {
// Given
QueryExecution queryExecution = mock(QueryExecution.class);
when(queryExecution.fieldNames()).thenReturn(new String[] { "foo" });
when(queryExecution.executionType()).thenReturn(query(READ_ONLY));
when(queryExecution.getNotifications()).thenReturn(Collections.emptyList());
when(queryExecution.await()).thenReturn(false);
BoltAdapterSubscriber subscriber = new BoltAdapterSubscriber();
QueryStatistics queryStatistics = mock(QueryStatistics.class);
when(queryStatistics.containsUpdates()).thenReturn(false);
when(queryStatistics.getNodesCreated()).thenReturn(0);
when(queryStatistics.getNodesDeleted()).thenReturn(0);
when(queryStatistics.getRelationshipsCreated()).thenReturn(0);
when(queryStatistics.getRelationshipsDeleted()).thenReturn(0);
when(queryStatistics.getPropertiesSet()).thenReturn(0);
when(queryStatistics.getIndexesAdded()).thenReturn(0);
when(queryStatistics.getIndexesRemoved()).thenReturn(0);
when(queryStatistics.getConstraintsAdded()).thenReturn(0);
when(queryStatistics.getConstraintsRemoved()).thenReturn(0);
when(queryStatistics.getLabelsAdded()).thenReturn(0);
when(queryStatistics.getLabelsRemoved()).thenReturn(0);
subscriber.onResultCompleted(queryStatistics);
Clock clock = mock(Clock.class);
var stream = new TestAbstractCypherAdapterStream(queryExecution, subscriber, clock);
// When
stream.discardRecords(mock(BoltResult.DiscardingRecordConsumer.class), STREAM_LIMIT_UNLIMITED);
// Then
verify(queryExecution, times(1)).cancel();
verify(queryExecution, times(1)).await();
}
Aggregations