public async Task Query(QueryRequest request, ChannelWriter <Page> channelWriter, ServerCallContext context) { var parameters = ParameterDecoder.DecodeParameters(request.Parameters); QueryResult queryResult; try { queryResult = await _koraliumExecutor.Execute(request.Query, parameters, context.GetHttpContext()); } catch (AuthorizationFailedException authFailed) { throw new RpcException(new Status(StatusCode.Unauthenticated, authFailed.Message)); } var enumerator = queryResult.Result.GetEnumerator(); Page page = new Page() { Metadata = new QueryMetadata() }; foreach (var metadata in queryResult.Metadata) { page.Metadata.CustomMetadata.Add(new KeyValue() { Name = metadata.Key, Value = ScalarEncoder.EncodeScalarResult(metadata.Value) }); } IEncoder[] encoders = new IEncoder[queryResult.Columns.Count]; Func <object, object>[] propertyGetters = new Func <object, object> [encoders.Length]; int indexCounter = 0; for (int i = 0; i < queryResult.Columns.Count; i++) { var column = queryResult.Columns[i]; var columnMetadata = ToMetadata(ref indexCounter, column); encoders[i] = EncoderHelper.GetEncoder(column.Type, columnMetadata, column.Children); propertyGetters[i] = column.GetFunction; page.Metadata.Columns.Add(columnMetadata); } System.Diagnostics.Stopwatch encodeWatch = new System.Diagnostics.Stopwatch(); encodeWatch.Start(); await EncoderHelper.ReadData(_logger, page, encoders, propertyGetters, enumerator, request.MaxBatchSize, channelWriter); encodeWatch.Stop(); _logger.LogTrace($"Encode time: {encodeWatch.ElapsedMilliseconds} ms"); }
public ValueTask <object> ExecuteScalar(QueryRequest queryRequest, ServerCallContext context) { var sqlParameters = ParameterDecoder.DecodeParameters(queryRequest.Parameters); Dictionary <string, object> extraDatas = new Dictionary <string, object>(); foreach (var extraData in queryRequest.ExtraData) { extraDatas.Add(extraData.Name, ScalarDecoder.DecodeScalar(extraData.Value)); } return(_koraliumExecutor.ExecuteScalar(queryRequest.Query, sqlParameters, context.GetHttpContext())); }