33using Couchbase . Analytics . Performer . Internal . Connections ;
44using Couchbase . Analytics . Performer . Internal . Modes ;
55using Couchbase . Analytics . Performer . Internal . Utils ;
6+ using Couchbase . AnalyticsClient . Async ;
67using Couchbase . AnalyticsClient . Options ;
78using Couchbase . AnalyticsClient . Results ;
89using Couchbase . Core . Utils ;
@@ -146,7 +147,7 @@ public override async Task<QueryRowResponse> QueryRow(QueryRowRequest request, S
146147
147148 try
148149 {
149- response = await performerQuery . GetNextRow ( ) . ConfigureAwait ( false ) ;
150+ response = await performerQuery . GetNextRow ( request . ContentAs ) . ConfigureAwait ( false ) ;
150151 response . Metadata = new ResponseMetadata
151152 {
152153 ElapsedNanos = ( long ) stopwatch . Elapsed . TotalNanoseconds ,
@@ -251,6 +252,206 @@ public override Task<EmptyResultOrFailureResponse> CloseQueryResult(CloseQueryRe
251252 return Task . FromResult ( response ) ;
252253 }
253254
255+ public override async Task < StartQueryResponse > StartQuery ( StartQueryRequest request , ServerCallContext context )
256+ {
257+ Serilog . Log . Information ( "Executing startQuery" ) ;
258+
259+ var response = new StartQueryResponse ( ) ;
260+
261+ try
262+ {
263+ var options = request . Options . ToStartQueryOptions ( ) ;
264+ var queryHandle = Guid . NewGuid ( ) . ToString ( ) ;
265+
266+ QueryHandle sdkHandle ;
267+ switch ( request . LevelCase )
268+ {
269+ case StartQueryRequest . LevelOneofCase . ClusterLevel :
270+ var clusterConn = _clusterConnections [ request . ClusterLevel . ClusterId ] ;
271+ sdkHandle = await clusterConn . StartClusterQuery ( request . Statement , options ) . ConfigureAwait ( false ) ;
272+ break ;
273+ case StartQueryRequest . LevelOneofCase . ScopeLevel :
274+ var scopeConn = _clusterConnections [ request . ScopeLevel . ClusterId ] ;
275+ sdkHandle = await scopeConn . StartScopeQuery (
276+ request . ScopeLevel . DatabaseName ,
277+ request . ScopeLevel . ScopeName ,
278+ request . Statement ,
279+ options ) . ConfigureAwait ( false ) ;
280+ break ;
281+ case StartQueryRequest . LevelOneofCase . None :
282+ default :
283+ throw new ArgumentException ( "No level specified for query" ) ;
284+ }
285+
286+ var performerQuery = new PerformerQuery
287+ {
288+ AsyncHandle = sdkHandle ,
289+ CancellationTokenSource = new CancellationTokenSource ( ) ,
290+ } ;
291+ _ongoingQueries [ queryHandle ] = performerQuery ;
292+
293+ response . QueryHandle = queryHandle ;
294+ }
295+ catch ( Exception ex )
296+ {
297+ response . Failure = ex . ToProtoError ( ) ;
298+ }
299+
300+ return response ;
301+ }
302+
303+ public override async Task < AsyncFetchStatusResponse > AsyncFetchStatus ( AsyncFetchStatusRequest request ,
304+ ServerCallContext context )
305+ {
306+ Serilog . Log . Information ( "Executing asyncFetchStatus" ) ;
307+
308+ var response = new AsyncFetchStatusResponse ( ) ;
309+
310+ try
311+ {
312+ if ( ! _ongoingQueries . TryGetValue ( request . QueryHandle , out var performerQuery )
313+ || performerQuery . AsyncHandle is null )
314+ {
315+ throw new KeyNotFoundException (
316+ "Query handle not present in ongoing async queries: " + request . QueryHandle ) ;
317+ }
318+
319+ var status = await performerQuery . AsyncHandle . FetchStatusAsync ( ) . ConfigureAwait ( false ) ;
320+ performerQuery . AsyncStatus = status ;
321+
322+ response . QueryStatus = new AsyncFetchStatusResponse . Types . QueryStatusResult
323+ {
324+ ResultsReady = status . ResultsReady ,
325+ ToString_ = status . ToString ( ) ?? string . Empty ,
326+ } ;
327+ }
328+ catch ( Exception ex )
329+ {
330+ response . Failure = ex . ToProtoError ( ) ;
331+ }
332+
333+ return response ;
334+ }
335+
336+ public override Task < EmptyResultOrFailureResponse > AsyncQueryStatusResultHandle (
337+ AsyncQueryStatusResultHandleRequest request , ServerCallContext context )
338+ {
339+ Serilog . Log . Information ( "Executing asyncQueryStatusResultHandle" ) ;
340+ var stopwatch = LightweightStopwatch . StartNew ( ) ;
341+ var initiated = Timestamp . FromDateTime ( DateTime . UtcNow ) ;
342+
343+ Exception ? exception = null ;
344+ try
345+ {
346+ if ( ! _ongoingQueries . TryGetValue ( request . QueryHandle , out var performerQuery )
347+ || performerQuery . AsyncStatus is null )
348+ {
349+ throw new KeyNotFoundException (
350+ "QueryStatus not present for query: " + request . QueryHandle ) ;
351+ }
352+
353+ performerQuery . AsyncResultHandle = performerQuery . AsyncStatus . ResultHandle ( ) ;
354+ }
355+ catch ( Exception ex )
356+ {
357+ exception = ex ;
358+ }
359+
360+ var response = new EmptyResultOrFailureResponse ( )
361+ . GetResponseMetaData ( stopwatch , initiated , exception ) ;
362+ return Task . FromResult ( response ) ;
363+ }
364+
365+ public override async Task < EmptyResultOrFailureResponse > AsyncCancelHandle ( AsyncCancelHandleRequest request ,
366+ ServerCallContext context )
367+ {
368+ Serilog . Log . Information ( "Executing asyncCancelHandle" ) ;
369+ var stopwatch = LightweightStopwatch . StartNew ( ) ;
370+ var initiated = Timestamp . FromDateTime ( DateTime . UtcNow ) ;
371+
372+ Exception ? exception = null ;
373+ try
374+ {
375+ if ( ! _ongoingQueries . TryGetValue ( request . QueryHandle , out var performerQuery )
376+ || performerQuery . AsyncHandle is null )
377+ {
378+ throw new KeyNotFoundException (
379+ "Query handle not present in ongoing async queries: " + request . QueryHandle ) ;
380+ }
381+
382+ await performerQuery . AsyncHandle . CancelAsync ( ) . ConfigureAwait ( false ) ;
383+ }
384+ catch ( Exception ex )
385+ {
386+ exception = ex ;
387+ }
388+
389+ return new EmptyResultOrFailureResponse ( ) . GetResponseMetaData ( stopwatch , initiated , exception ) ;
390+ }
391+
392+ public override async Task < EmptyResultOrFailureResponse > AsyncFetchResults ( AsyncFetchResultsRequest request ,
393+ ServerCallContext context )
394+ {
395+ Serilog . Log . Information ( "Executing asyncFetchResults" ) ;
396+ var stopwatch = LightweightStopwatch . StartNew ( ) ;
397+ var initiated = Timestamp . FromDateTime ( DateTime . UtcNow ) ;
398+
399+ Exception ? exception = null ;
400+ try
401+ {
402+ if ( ! _ongoingQueries . TryGetValue ( request . QueryHandle , out var performerQuery )
403+ || performerQuery . AsyncResultHandle is null )
404+ {
405+ throw new KeyNotFoundException (
406+ "Result handle not present for query: " + request . QueryHandle ) ;
407+ }
408+
409+ var fetchOptions = new FetchResultsOptions ( ) ;
410+ if ( request . Options ? . Deserializer is not null )
411+ {
412+ fetchOptions = fetchOptions . WithDeserializer ( request . Options . Deserializer . ToCore ( ) ) ;
413+ }
414+
415+ var queryResult = await performerQuery . AsyncResultHandle
416+ . FetchResultsAsync ( fetchOptions ) . ConfigureAwait ( false ) ;
417+
418+ performerQuery . QueryTask = Task . FromResult ( queryResult ) ;
419+ }
420+ catch ( Exception ex )
421+ {
422+ exception = ex ;
423+ }
424+
425+ return new EmptyResultOrFailureResponse ( ) . GetResponseMetaData ( stopwatch , initiated , exception ) ;
426+ }
427+
428+ public override async Task < EmptyResultOrFailureResponse > AsyncDiscardResults ( AsyncDiscardResultsRequest request ,
429+ ServerCallContext context )
430+ {
431+ Serilog . Log . Information ( "Executing asyncDiscardResults" ) ;
432+ var stopwatch = LightweightStopwatch . StartNew ( ) ;
433+ var initiated = Timestamp . FromDateTime ( DateTime . UtcNow ) ;
434+
435+ Exception ? exception = null ;
436+ try
437+ {
438+ if ( ! _ongoingQueries . TryGetValue ( request . QueryHandle , out var performerQuery )
439+ || performerQuery . AsyncResultHandle is null )
440+ {
441+ throw new KeyNotFoundException (
442+ "Result handle not present for query: " + request . QueryHandle ) ;
443+ }
444+
445+ await performerQuery . AsyncResultHandle . DiscardResultsAsync ( ) . ConfigureAwait ( false ) ;
446+ }
447+ catch ( Exception ex )
448+ {
449+ exception = ex ;
450+ }
451+
452+ return new EmptyResultOrFailureResponse ( ) . GetResponseMetaData ( stopwatch , initiated , exception ) ;
453+ }
454+
254455 public override Task < EmptyResultOrFailureResponse > CloseAllQueryResults ( CloseAllQueryResultsRequest request ,
255456 ServerCallContext context )
256457 {
@@ -265,4 +466,4 @@ public override Task<EmptyResultOrFailureResponse> CloseAllQueryResults(CloseAll
265466
266467 return Task . FromResult ( response ) ;
267468 }
268- }
469+ }
0 commit comments