This is an automated email from the ASF dual-hosted git repository. ptupitsyn pushed a commit to branch ignite-27278 in repository https://gitbox.apache.org/repos/asf/ignite-3.git
commit 583afbd7921673ac4970e958faa711f838ef7440 Author: Pavel Tupitsyn <[email protected]> AuthorDate: Tue Dec 23 15:35:18 2025 +0200 Propagate rowReaderArg --- .../Internal/Linq/IgniteQueryExecutor.cs | 3 +- .../dotnet/Apache.Ignite/Internal/Sql/ResultSet.cs | 11 ++++-- .../dotnet/Apache.Ignite/Internal/Sql/RowReader.cs | 3 +- .../Apache.Ignite/Internal/Sql/RowReaderFactory.cs | 3 +- .../dotnet/Apache.Ignite/Internal/Sql/Sql.cs | 45 ++++++++++------------ 5 files changed, 33 insertions(+), 32 deletions(-) diff --git a/modules/platforms/dotnet/Apache.Ignite/Internal/Linq/IgniteQueryExecutor.cs b/modules/platforms/dotnet/Apache.Ignite/Internal/Linq/IgniteQueryExecutor.cs index e17fa47d80f..f332f41578a 100644 --- a/modules/platforms/dotnet/Apache.Ignite/Internal/Linq/IgniteQueryExecutor.cs +++ b/modules/platforms/dotnet/Apache.Ignite/Internal/Linq/IgniteQueryExecutor.cs @@ -139,7 +139,8 @@ internal sealed class IgniteQueryExecutor : IQueryExecutor IResultSet<T> resultSet = await _sql.ExecuteAsyncInternal( _transaction, statement, - cols => ResultSelector.Get<T>(cols, queryModel.SelectClause.Selector, selectorOptions), + meta => ResultSelector.Get<T>(meta.Columns, queryModel.SelectClause.Selector, selectorOptions), + rowReaderArg: null, queryData.Parameters, CancellationToken.None) .ConfigureAwait(false); diff --git a/modules/platforms/dotnet/Apache.Ignite/Internal/Sql/ResultSet.cs b/modules/platforms/dotnet/Apache.Ignite/Internal/Sql/ResultSet.cs index 91f081900b4..798079578b1 100644 --- a/modules/platforms/dotnet/Apache.Ignite/Internal/Sql/ResultSet.cs +++ b/modules/platforms/dotnet/Apache.Ignite/Internal/Sql/ResultSet.cs @@ -48,6 +48,8 @@ namespace Apache.Ignite.Internal.Sql private readonly RowReader<T>? _rowReader; + private readonly object? _rowReaderArg; + private readonly CancellationToken _cancellationToken; private bool _resourceClosed; @@ -62,13 +64,13 @@ namespace Apache.Ignite.Internal.Sql /// <param name="socket">Socket.</param> /// <param name="buf">Buffer to read initial data from.</param> /// <param name="rowReaderFactory">Row reader factory.</param> - /// <param name="rowReaderFactoryArg">Row reader factory argument.</param> + /// <param name="rowReaderArg">Row reader argument.</param> /// <param name="cancellationToken">Cancellation token.</param> public ResultSet( ClientSocket socket, PooledBuffer buf, RowReaderFactory<T> rowReaderFactory, - object? rowReaderFactoryArg, + object? rowReaderArg, CancellationToken cancellationToken) { _socket = socket; @@ -85,7 +87,8 @@ namespace Apache.Ignite.Internal.Sql AffectedRows = reader.ReadInt64(); _metadata = HasRowSet ? ReadMeta(ref reader) : null; - _rowReader = _metadata != null ? rowReaderFactory(_metadata, rowReaderFactoryArg) : null; + _rowReader = _metadata != null ? rowReaderFactory(_metadata) : null; + _rowReaderArg = rowReaderArg; if (HasRowSet) { @@ -329,7 +332,7 @@ namespace Apache.Ignite.Internal.Sql { var tupleReader = new BinaryTupleReader(reader.ReadBinary(), _metadata!.Columns.Count); - return _rowReader!(_metadata, ref tupleReader); + return _rowReader!(_metadata, ref tupleReader, _rowReaderArg); } private async IAsyncEnumerable<T> EnumerateRows() diff --git a/modules/platforms/dotnet/Apache.Ignite/Internal/Sql/RowReader.cs b/modules/platforms/dotnet/Apache.Ignite/Internal/Sql/RowReader.cs index 8072cd8b2b4..37daa714df1 100644 --- a/modules/platforms/dotnet/Apache.Ignite/Internal/Sql/RowReader.cs +++ b/modules/platforms/dotnet/Apache.Ignite/Internal/Sql/RowReader.cs @@ -24,6 +24,7 @@ using Proto.BinaryTuple; /// </summary> /// <param name="metadata">Metadata.</param> /// <param name="tupleReader">Tuple reader.</param> +/// <param name="arg">Argument.</param> /// <typeparam name="T">Result type.</typeparam> /// <returns>Resulting row.</returns> -internal delegate T RowReader<out T>(ResultSetMetadata metadata, ref BinaryTupleReader tupleReader); +internal delegate T RowReader<out T>(ResultSetMetadata metadata, ref BinaryTupleReader tupleReader, object? arg); diff --git a/modules/platforms/dotnet/Apache.Ignite/Internal/Sql/RowReaderFactory.cs b/modules/platforms/dotnet/Apache.Ignite/Internal/Sql/RowReaderFactory.cs index 73ee3548b94..73889c97ec7 100644 --- a/modules/platforms/dotnet/Apache.Ignite/Internal/Sql/RowReaderFactory.cs +++ b/modules/platforms/dotnet/Apache.Ignite/Internal/Sql/RowReaderFactory.cs @@ -21,7 +21,6 @@ namespace Apache.Ignite.Internal.Sql; /// Row reader factory. /// </summary> /// <param name="metadata">Metadata.</param> -/// <param name="arg">Argument.</param> /// <typeparam name="T">Result type.</typeparam> /// <returns>Resulting row.</returns> -internal delegate RowReader<T> RowReaderFactory<out T>(ResultSetMetadata metadata, object? arg); +internal delegate RowReader<T> RowReaderFactory<out T>(ResultSetMetadata metadata); diff --git a/modules/platforms/dotnet/Apache.Ignite/Internal/Sql/Sql.cs b/modules/platforms/dotnet/Apache.Ignite/Internal/Sql/Sql.cs index da63f07b466..7d1eb0e6a58 100644 --- a/modules/platforms/dotnet/Apache.Ignite/Internal/Sql/Sql.cs +++ b/modules/platforms/dotnet/Apache.Ignite/Internal/Sql/Sql.cs @@ -42,9 +42,9 @@ namespace Apache.Ignite.Internal.Sql internal sealed class Sql : ISql { private static readonly RowReader<IIgniteTuple> TupleReader = - static (ResultSetMetadata metadata, ref BinaryTupleReader reader) => ReadTuple(metadata.Columns, ref reader); + static (ResultSetMetadata metadata, ref BinaryTupleReader reader, object? _) => ReadTuple(metadata.Columns, ref reader); - private static readonly RowReaderFactory<IIgniteTuple> TupleReaderFactory = static (_, _) => TupleReader; + private static readonly RowReaderFactory<IIgniteTuple> TupleReaderFactory = static _ => TupleReader; /** Underlying connection. */ private readonly ClientFailoverSocket _socket; @@ -65,7 +65,7 @@ namespace Apache.Ignite.Internal.Sql transaction, statement, TupleReaderFactory, - rowReaderFactoryArg: null, + rowReaderArg: null, args, cancellationToken) .ConfigureAwait(false); @@ -77,8 +77,8 @@ namespace Apache.Ignite.Internal.Sql await ExecuteAsyncInternal( transaction, statement, - static (meta, _) => GetReaderFactory<T>(meta), - rowReaderFactoryArg: null, + static meta => GetReaderFactory<T>(meta), + rowReaderArg: null, args, cancellationToken) .ConfigureAwait(false); @@ -91,26 +91,23 @@ namespace Apache.Ignite.Internal.Sql CancellationToken cancellationToken, params object?[]? args) { - // TODO: avoid allocation - RowReaderFactory<T> rowReaderFactory = static (meta, arg) => - { - return (ResultSetMetadata meta, ref BinaryTupleReader reader) => - { - var mapperReader = new RowReader(ref reader, meta); - var mapper = (IMapper<T>)arg!; - - return mapper.Read(ref mapperReader, meta); - }; - }; - return await ExecuteAsyncInternal( transaction, statement, - rowReaderFactory, - rowReaderFactoryArg: mapper, + RowReaderFactory, + rowReaderArg: mapper, args, cancellationToken) .ConfigureAwait(false); + + static RowReader<T> RowReaderFactory(ResultSetMetadata resultSetMetadata) => + static (ResultSetMetadata meta, ref BinaryTupleReader reader, object? arg) => + { + var mapperReader = new RowReader(ref reader, meta); + var mapper = (IMapper<T>)arg!; + + return mapper.Read(ref mapperReader, meta); + }; } /// <inheritdoc/> @@ -120,8 +117,8 @@ namespace Apache.Ignite.Internal.Sql var resultSet = await ExecuteAsyncInternal<object>( transaction, statement, - static (_, _) => null!, - rowReaderFactoryArg: null, + static _ => null!, + rowReaderArg: null, args, cancellationToken).ConfigureAwait(false); @@ -259,7 +256,7 @@ namespace Apache.Ignite.Internal.Sql /// <param name="transaction">Optional transaction.</param> /// <param name="statement">Statement to execute.</param> /// <param name="rowReaderFactory">Row reader factory.</param> - /// <param name="rowReaderFactoryArg">Row reader factory arg.</param> + /// <param name="rowReaderArg">Row reader arg.</param> /// <param name="args">Arguments for the statement.</param> /// <param name="cancellationToken">Cancellation token.</param> /// <typeparam name="T">Row type.</typeparam> @@ -268,7 +265,7 @@ namespace Apache.Ignite.Internal.Sql ITransaction? transaction, SqlStatement statement, RowReaderFactory<T> rowReaderFactory, - object? rowReaderFactoryArg, + object? rowReaderArg, ICollection<object?>? args, CancellationToken cancellationToken) { @@ -288,7 +285,7 @@ namespace Apache.Ignite.Internal.Sql ClientOp.SqlExec, tx, bufferWriter, cancellationToken: cancellationToken).ConfigureAwait(false); // ResultSet will dispose the pooled buffer. - return new ResultSet<T>(socket, buf, rowReaderFactory, rowReaderFactoryArg, cancellationToken); + return new ResultSet<T>(socket, buf, rowReaderFactory, rowReaderArg, cancellationToken); } catch (SqlException e) {
