You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by pt...@apache.org on 2025/12/23 13:35:28 UTC
(ignite-3) 01/02: wip
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 d2e96767b2cf4ccb1271d21c38901ddf1386e542
Author: Pavel Tupitsyn <pt...@apache.org>
AuthorDate: Tue Dec 23 15:26:02 2025 +0200
wip
---
.../dotnet/Apache.Ignite/Internal/Sql/ResultSet.cs | 10 +++++--
.../Apache.Ignite/Internal/Sql/RowReaderFactory.cs | 3 +-
.../dotnet/Apache.Ignite/Internal/Sql/Sql.cs | 32 +++++++++++++++++-----
3 files changed, 35 insertions(+), 10 deletions(-)
diff --git a/modules/platforms/dotnet/Apache.Ignite/Internal/Sql/ResultSet.cs b/modules/platforms/dotnet/Apache.Ignite/Internal/Sql/ResultSet.cs
index db541ff3ec8..91f081900b4 100644
--- a/modules/platforms/dotnet/Apache.Ignite/Internal/Sql/ResultSet.cs
+++ b/modules/platforms/dotnet/Apache.Ignite/Internal/Sql/ResultSet.cs
@@ -62,8 +62,14 @@ 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="cancellationToken">Cancellation token.</param>
- public ResultSet(ClientSocket socket, PooledBuffer buf, RowReaderFactory<T> rowReaderFactory, CancellationToken cancellationToken)
+ public ResultSet(
+ ClientSocket socket,
+ PooledBuffer buf,
+ RowReaderFactory<T> rowReaderFactory,
+ object? rowReaderFactoryArg,
+ CancellationToken cancellationToken)
{
_socket = socket;
_cancellationToken = cancellationToken;
@@ -79,7 +85,7 @@ namespace Apache.Ignite.Internal.Sql
AffectedRows = reader.ReadInt64();
_metadata = HasRowSet ? ReadMeta(ref reader) : null;
- _rowReader = _metadata != null ? rowReaderFactory(_metadata) : null;
+ _rowReader = _metadata != null ? rowReaderFactory(_metadata, rowReaderFactoryArg) : null;
if (HasRowSet)
{
diff --git a/modules/platforms/dotnet/Apache.Ignite/Internal/Sql/RowReaderFactory.cs b/modules/platforms/dotnet/Apache.Ignite/Internal/Sql/RowReaderFactory.cs
index 73889c97ec7..73ee3548b94 100644
--- a/modules/platforms/dotnet/Apache.Ignite/Internal/Sql/RowReaderFactory.cs
+++ b/modules/platforms/dotnet/Apache.Ignite/Internal/Sql/RowReaderFactory.cs
@@ -21,6 +21,7 @@ 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);
+internal delegate RowReader<T> RowReaderFactory<out T>(ResultSetMetadata metadata, object? arg);
diff --git a/modules/platforms/dotnet/Apache.Ignite/Internal/Sql/Sql.cs b/modules/platforms/dotnet/Apache.Ignite/Internal/Sql/Sql.cs
index 182d5dc528e..da63f07b466 100644
--- a/modules/platforms/dotnet/Apache.Ignite/Internal/Sql/Sql.cs
+++ b/modules/platforms/dotnet/Apache.Ignite/Internal/Sql/Sql.cs
@@ -44,7 +44,7 @@ namespace Apache.Ignite.Internal.Sql
private static readonly RowReader<IIgniteTuple> TupleReader =
static (ResultSetMetadata metadata, ref BinaryTupleReader reader) => 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;
@@ -61,7 +61,14 @@ namespace Apache.Ignite.Internal.Sql
/// <inheritdoc/>
public async Task<IResultSet<IIgniteTuple>> ExecuteAsync(
ITransaction? transaction, SqlStatement statement, CancellationToken cancellationToken, params object?[]? args) =>
- await ExecuteAsyncInternal(transaction, statement, TupleReaderFactory, args, cancellationToken).ConfigureAwait(false);
+ await ExecuteAsyncInternal(
+ transaction,
+ statement,
+ TupleReaderFactory,
+ rowReaderFactoryArg: null,
+ args,
+ cancellationToken)
+ .ConfigureAwait(false);
/// <inheritdoc/>
[RequiresUnreferencedCode(ReflectionUtils.TrimWarning)]
@@ -70,7 +77,8 @@ namespace Apache.Ignite.Internal.Sql
await ExecuteAsyncInternal(
transaction,
statement,
- static meta => GetReaderFactory<T>(meta),
+ static (meta, _) => GetReaderFactory<T>(meta),
+ rowReaderFactoryArg: null,
args,
cancellationToken)
.ConfigureAwait(false);
@@ -83,12 +91,14 @@ namespace Apache.Ignite.Internal.Sql
CancellationToken cancellationToken,
params object?[]? args)
{
- // TODO: Cache or avoid allocation?
- RowReaderFactory<T> rowReaderFactory = _ =>
+ // 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);
};
};
@@ -97,6 +107,7 @@ namespace Apache.Ignite.Internal.Sql
transaction,
statement,
rowReaderFactory,
+ rowReaderFactoryArg: mapper,
args,
cancellationToken)
.ConfigureAwait(false);
@@ -107,7 +118,12 @@ namespace Apache.Ignite.Internal.Sql
ITransaction? transaction, SqlStatement statement, CancellationToken cancellationToken, params object?[]? args)
{
var resultSet = await ExecuteAsyncInternal<object>(
- transaction, statement, _ => null!, args, cancellationToken).ConfigureAwait(false);
+ transaction,
+ statement,
+ static (_, _) => null!,
+ rowReaderFactoryArg: null,
+ args,
+ cancellationToken).ConfigureAwait(false);
if (!resultSet.HasRowSet)
{
@@ -243,6 +259,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="args">Arguments for the statement.</param>
/// <param name="cancellationToken">Cancellation token.</param>
/// <typeparam name="T">Row type.</typeparam>
@@ -251,6 +268,7 @@ namespace Apache.Ignite.Internal.Sql
ITransaction? transaction,
SqlStatement statement,
RowReaderFactory<T> rowReaderFactory,
+ object? rowReaderFactoryArg,
ICollection<object?>? args,
CancellationToken cancellationToken)
{
@@ -270,7 +288,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, cancellationToken);
+ return new ResultSet<T>(socket, buf, rowReaderFactory, rowReaderFactoryArg, cancellationToken);
}
catch (SqlException e)
{