public override async Task <IStatementResultCursor> RunInExplicitTransactionAsync(IConnection connection, Statement statement, bool reactive, long fetchSize = Config.Infinite) { var summaryBuilder = new SummaryBuilder(statement, connection.Server); var streamBuilder = new StatementResultCursorBuilder(summaryBuilder, connection.ReceiveOneAsync, RequestMore(connection, summaryBuilder, null), CancelRequest(connection, summaryBuilder, null), null, fetchSize, reactive); var runHandler = new V4.RunResponseHandler(streamBuilder, summaryBuilder); var pullMessage = default(PullMessage); var pullHandler = default(V4.PullResponseHandler); if (!reactive) { pullMessage = new PullMessage(fetchSize); pullHandler = new V4.PullResponseHandler(streamBuilder, summaryBuilder, null); } await connection.EnqueueAsync(new RunWithMetadataMessage(statement), runHandler, pullMessage, pullHandler) .ConfigureAwait(false); await connection.SendAsync().ConfigureAwait(false); return(streamBuilder.CreateCursor()); }
public override async Task <IStatementResultCursor> RunInAutoCommitTransactionAsync(IConnection connection, Statement statement, bool reactive, IBookmarkTracker bookmarkTracker, IResultResourceHandler resultResourceHandler, string database, Bookmark bookmark, TransactionConfig configBuilder, long fetchSize = Config.Infinite) { var summaryBuilder = new SummaryBuilder(statement, connection.Server); var streamBuilder = new StatementResultCursorBuilder(summaryBuilder, connection.ReceiveOneAsync, RequestMore(connection, summaryBuilder, bookmarkTracker), CancelRequest(connection, summaryBuilder, bookmarkTracker), resultResourceHandler, fetchSize, reactive); var runHandler = new V4.RunResponseHandler(streamBuilder, summaryBuilder); var pullMessage = default(PullMessage); var pullHandler = default(V4.PullResponseHandler); if (!reactive) { pullMessage = new PullMessage(fetchSize); pullHandler = new V4.PullResponseHandler(streamBuilder, summaryBuilder, bookmarkTracker); } await connection .EnqueueAsync( new RunWithMetadataMessage(statement, database, bookmark, configBuilder, connection.GetEnforcedAccessMode()), runHandler, pullMessage, pullHandler) .ConfigureAwait(false); await connection.SendAsync().ConfigureAwait(false); return(streamBuilder.CreateCursor()); }
public void ShouldStartInRunRequestedState() { var builder = new StatementResultCursorBuilder(CreateSummaryBuilder(), CreateTaskQueue(), null, null, null); builder.CurrentState.Should().Be(StatementResultCursorBuilder.State.RunRequested); }
public void ShouldTransitionToRunCompletedWhenRunCompleted() { var builder = new StatementResultCursorBuilder(CreateSummaryBuilder(), CreateTaskQueue(), null, null, null); builder.CurrentState.Should().Be(StatementResultCursorBuilder.State.RunRequested); builder.RunCompleted(0, new[] { "a", "b", "c" }, null); builder.CurrentState.Should().Be(StatementResultCursorBuilder.State.RunCompleted); }
public void ShouldTransitionToCompletedWhenPullCompleted() { var builder = new StatementResultCursorBuilder(CreateSummaryBuilder(), CreateTaskQueue(), null, null, null) { CurrentState = StatementResultCursorBuilder.State.RecordsStreaming }; builder.PullCompleted(false, null); builder.CurrentState.Should().Be(StatementResultCursorBuilder.State.Completed); }
public void ShouldTransitionToRecordsStreamingStreamingWhenRecordIsPushed() { var builder = new StatementResultCursorBuilder(CreateSummaryBuilder(), CreateTaskQueue(), null, null, null); builder.CurrentState.Should().Be(StatementResultCursorBuilder.State.RunRequested); builder.RunCompleted(0, new[] { "a", "b", "c" }, null); builder.CurrentState.Should().Be(StatementResultCursorBuilder.State.RunCompleted); builder.PushRecord(new object[] { 1, 2, 3 }); builder.CurrentState.Should().Be(StatementResultCursorBuilder.State.RecordsStreaming); }
public async Task <IStatementResultCursor> RunInExplicitTransactionAsync(IConnection connection, Statement statement, bool reactive) { var summaryBuilder = new SummaryBuilder(statement, connection.Server); var streamBuilder = new StatementResultCursorBuilder(summaryBuilder, connection.ReceiveOneAsync, null, null, null); var runHandler = new V1.RunResponseHandler(streamBuilder, summaryBuilder); var pullAllHandler = new V1.PullResponseHandler(streamBuilder, summaryBuilder); await connection.EnqueueAsync(new RunMessage(statement), runHandler, PullAll, pullAllHandler) .ConfigureAwait(false); await connection.SendAsync().ConfigureAwait(false); return(streamBuilder.CreateCursor()); }
public async Task <IStatementResultCursor> RunInAutoCommitTransactionAsync(IConnection connection, Statement statement, bool reactive, IBookmarkTracker bookmarkTracker, IResultResourceHandler resultResourceHandler, Bookmark ignored, TransactionConfig txConfig) { AssertNullOrEmptyTransactionConfig(txConfig); var summaryBuilder = new SummaryBuilder(statement, connection.Server); var streamBuilder = new StatementResultCursorBuilder(summaryBuilder, connection.ReceiveOneAsync, null, null, resultResourceHandler); var runHandler = new V1.RunResponseHandler(streamBuilder, summaryBuilder); var pullAllHandler = new V1.PullResponseHandler(streamBuilder, summaryBuilder); await connection.EnqueueAsync(new RunMessage(statement), runHandler, PullAll, pullAllHandler) .ConfigureAwait(false); await connection.SendAsync().ConfigureAwait(false); return(streamBuilder.CreateCursor()); }
public async Task ShouldCallMoreOnceAndReturnRecords() { var actions = new Queue <Action>(); var builder = new StatementResultCursorBuilder(CreateSummaryBuilder(), CreateTaskQueue(actions), MoreFunction(), CancelFunction(), null); actions.Enqueue(() => builder.RunCompleted(0, new[] { "a" }, null)); actions.Enqueue(() => builder.PushRecord(new object[] { 1 })); actions.Enqueue(() => builder.PushRecord(new object[] { 2 })); actions.Enqueue(() => builder.PushRecord(new object[] { 3 })); actions.Enqueue(() => builder.PullCompleted(false, null)); var list = await builder.CreateCursor().ToListAsync(r => r[0].As <int>()); list.Should().BeEquivalentTo(1, 2, 3); moreCallCount.Should().Be(1); cancelCallCount.Should().Be(0); }
public async Task ShouldReturnFirstBatchOfRecordsAndCancel() { var actions = new Queue <Action>(); var builder = new StatementResultCursorBuilder(CreateSummaryBuilder(), CreateTaskQueue(actions), MoreFunction(), CancelFunction(), null); actions.Enqueue(() => builder.RunCompleted(0, new[] { "a" }, null)); actions.Enqueue(() => builder.PushRecord(new object[] { 1 })); actions.Enqueue(() => builder.PushRecord(new object[] { 2 })); actions.Enqueue(() => builder.PullCompleted(true, null)); actions.Enqueue(() => builder.PullCompleted(false, null)); var cursor = builder.CreateCursor(); var keys = await cursor.KeysAsync(); keys.Should().BeEquivalentTo("a"); var hasRecord1 = await cursor.FetchAsync(); var record1 = cursor.Current; hasRecord1.Should().BeTrue(); record1[0].Should().Be(1); var hasRecord2 = await cursor.FetchAsync(); var record2 = cursor.Current; hasRecord2.Should().BeTrue(); record2[0].Should().Be(2); cursor.Discard(); var list = await cursor.ToListAsync(r => r[0].As <int>()); list.Should().BeEmpty(); moreCallCount.Should().Be(1); cancelCallCount.Should().Be(1); }
public virtual async Task <IStatementResultCursor> RunInAutoCommitTransactionAsync(IConnection connection, Statement statement, bool reactive, IBookmarkTracker bookmarkTracker, IResultResourceHandler resultResourceHandler, Bookmark bookmark, TransactionConfig txConfig) { var summaryBuilder = new SummaryBuilder(statement, connection.Server); var streamBuilder = new StatementResultCursorBuilder(summaryBuilder, connection.ReceiveOneAsync, null, null, resultResourceHandler); var runHandler = new V3.RunResponseHandler(streamBuilder, summaryBuilder); var pullAllHandler = new V3.PullResponseHandler(streamBuilder, summaryBuilder, bookmarkTracker); await connection .EnqueueAsync( new RunWithMetadataMessage(statement, bookmark, txConfig, connection.GetEnforcedAccessMode()), runHandler, PullAll, pullAllHandler) .ConfigureAwait(false); await connection.SendAsync().ConfigureAwait(false); return(streamBuilder.CreateCursor()); }
public async Task ShouldCallCancelAndReturnNoRecords() { var actions = new Queue <Action>(); var builder = new StatementResultCursorBuilder(CreateSummaryBuilder(), CreateTaskQueue(actions), MoreFunction(), CancelFunction(), null); actions.Enqueue(() => builder.RunCompleted(0, new[] { "a" }, null)); actions.Enqueue(() => builder.PullCompleted(false, null)); var cursor = builder.CreateCursor(); var keys = await cursor.KeysAsync(); keys.Should().BeEquivalentTo("a"); cursor.Discard(); var list = await cursor.ToListAsync(r => r[0].As <int>()); list.Should().BeEmpty(); moreCallCount.Should().Be(0); cancelCallCount.Should().Be(1); }
public async Task ShouldInvokeResourceHandlerWhenCompleted() { var actions = new Queue <Action>(); var resourceHandler = new Mock <IResultResourceHandler>(); var builder = new StatementResultCursorBuilder(CreateSummaryBuilder(), CreateTaskQueue(actions), null, null, resourceHandler.Object); actions.Enqueue(() => builder.RunCompleted(0, new[] { "a" }, null)); actions.Enqueue(() => builder.PushRecord(new object[] { 1 })); actions.Enqueue(() => builder.PushRecord(new object[] { 2 })); actions.Enqueue(() => builder.PushRecord(new object[] { 3 })); actions.Enqueue(() => builder.PullCompleted(false, null)); var cursor = builder.CreateCursor(); var hasNext = await cursor.FetchAsync(); hasNext.Should().BeTrue(); resourceHandler.Verify(x => x.OnResultConsumedAsync(), Times.Never); hasNext = await cursor.FetchAsync(); hasNext.Should().BeTrue(); resourceHandler.Verify(x => x.OnResultConsumedAsync(), Times.Never); hasNext = await cursor.FetchAsync(); hasNext.Should().BeTrue(); resourceHandler.Verify(x => x.OnResultConsumedAsync(), Times.Never); hasNext = await cursor.FetchAsync(); hasNext.Should().BeFalse(); resourceHandler.Verify(x => x.OnResultConsumedAsync(), Times.Once); }