Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
remove experimental flag
  • Loading branch information
mgravell committed Jul 28, 2026
commit 8ae9f1da53e94b9e2077817c3f50d957b9fb74cf
2 changes: 1 addition & 1 deletion Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
<SuppressTfmSupportBuildWarnings>true</SuppressTfmSupportBuildWarnings>
<SuppressTfmSupportBuildErrors>true</SuppressTfmSupportBuildErrors>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
<NoWarn>$(NoWarn);CS1591;NRS003</NoWarn>
<NoWarn>$(NoWarn);CS1591</NoWarn>
<IsWindows>$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::get_Windows())))</IsWindows>
</PropertyGroup>

Expand Down
32 changes: 0 additions & 32 deletions docs/exp/NRS003.md

This file was deleted.

1 change: 0 additions & 1 deletion src/NRedisStack/Experiments.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ namespace NRedisStack
// NRS002 - Redis 8.8 multi-aggregate time-series
internal static class Experiments
{
public const string Server_8_10 = "NRS003";
// {0} is substituted with the diagnostic id, e.g. NRS042 -> https://redis.github.io/NRedisStack/exp/NRS042
public const string UrlFormat = "https://redis.github.io/NRedisStack/exp/{0}";
}
Expand Down
60 changes: 30 additions & 30 deletions src/NRedisStack/PublicAPI/PublicAPI.Unshipped.txt

Large diffs are not rendered by default.

7 changes: 0 additions & 7 deletions src/NRedisStack/TimeSeries/ITimeSeriesCommands.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
using NRedisStack.Literals.Enums;
using NRedisStack.DataTypes;
using System.ComponentModel;
using System.Diagnostics.CodeAnalysis;
using System.Runtime.CompilerServices;
namespace NRedisStack;

Expand Down Expand Up @@ -570,7 +569,6 @@ IReadOnlyList<TimeSeriesTuple> RevRange(string key,
/// <see cref="QueryIndex"/> / MRANGE / MGET). When omitted or empty, all indexed series are queried.</param>
/// <returns>The distinct label names; the collection is unordered and may be empty.</returns>
/// <remarks><seealso href="https://redis.io/commands/ts.querylabels"/></remarks>
[Experimental(Experiments.Server_8_10, UrlFormat = Experiments.UrlFormat)]
IReadOnlyList<string> QueryLabelNames(IReadOnlyCollection<string>? filter = null);

/// <summary>
Expand All @@ -582,7 +580,6 @@ IReadOnlyList<TimeSeriesTuple> RevRange(string key,
/// <see cref="QueryIndex"/> / MRANGE / MGET). When omitted or empty, all indexed series are queried.</param>
/// <returns>The distinct values of <paramref name="label"/>; the collection is unordered and may be empty.</returns>
/// <remarks><seealso href="https://redis.io/commands/ts.querylabels"/></remarks>
[Experimental(Experiments.Server_8_10, UrlFormat = Experiments.UrlFormat)]
IReadOnlyList<string> QueryLabelValues(string label, IReadOnlyCollection<string>? filter = null);

/// <summary>
Expand All @@ -606,7 +603,6 @@ IReadOnlyList<TimeSeriesTuple> RevRange(string key,
/// <param name="bt">Optional: controls how bucket timestamps are reported.</param>
/// <returns>The pivot rows; missing cells are <see cref="double.NaN"/>. May be empty.</returns>
/// <remarks><seealso href="https://redis.io/commands/ts.nrange"/></remarks>
[Experimental(Experiments.Server_8_10, UrlFormat = Experiments.UrlFormat)]
IReadOnlyList<TimeSeriesPivotRow> NRange(
IReadOnlyList<string> keys,
TimeStamp fromTimeStamp,
Expand Down Expand Up @@ -640,7 +636,6 @@ IReadOnlyList<TimeSeriesPivotRow> NRange(
/// <param name="bt">Optional: controls how bucket timestamps are reported.</param>
/// <returns>The pivot rows in reverse timestamp order; missing cells are <see cref="double.NaN"/>. May be empty.</returns>
/// <remarks><seealso href="https://redis.io/commands/ts.nrevrange"/></remarks>
[Experimental(Experiments.Server_8_10, UrlFormat = Experiments.UrlFormat)]
IReadOnlyList<TimeSeriesPivotRow> NRevRange(
IReadOnlyList<string> keys,
TimeStamp fromTimeStamp,
Expand All @@ -665,7 +660,6 @@ IReadOnlyList<TimeSeriesPivotRow> NRevRange(
/// <returns>The qualifying samples in ascending timestamp order; an empty list is a valid, successful reply.</returns>
/// <remarks>The server's BLOCK (wait-for-samples) mode is intentionally not exposed, as blocking does not
/// compose with the SE.Redis multiplexer. <seealso href="https://redis.io/commands/ts.read"/></remarks>
[Experimental(Experiments.Server_8_10, UrlFormat = Experiments.UrlFormat)]
IReadOnlyList<TimeSeriesTuple> Read(string key, TimeStamp timestamp, long? maxCount = null);

/// <summary>
Expand All @@ -678,7 +672,6 @@ IReadOnlyList<TimeSeriesPivotRow> NRevRange(
/// <param name="batchSize">Optional: page size (per underlying <c>MAX_COUNT</c>); when omitted, everything is read in one call.</param>
/// <returns>A lazy sequence of samples; enumeration ends when a non-full page is reached.</returns>
/// <remarks><seealso href="https://redis.io/commands/ts.read"/></remarks>
[Experimental(Experiments.Server_8_10, UrlFormat = Experiments.UrlFormat)]
IEnumerable<TimeSeriesTuple> ReadEnumerable(string key, TimeStamp fromTimeStamp, long? batchSize = null);

#endregion
Expand Down
7 changes: 0 additions & 7 deletions src/NRedisStack/TimeSeries/ITimeSeriesCommandsAsync.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
using NRedisStack.Literals.Enums;
using NRedisStack.DataTypes;
using System.ComponentModel;
using System.Diagnostics.CodeAnalysis;
using System.Runtime.CompilerServices;
namespace NRedisStack;

Expand Down Expand Up @@ -569,7 +568,6 @@ Task<IReadOnlyList<TimeSeriesTuple>> RevRangeAsync(string key,
/// <see cref="QueryIndexAsync"/> / MRANGE / MGET). When omitted or empty, all indexed series are queried.</param>
/// <returns>The distinct label names; the collection is unordered and may be empty.</returns>
/// <remarks><seealso href="https://redis.io/commands/ts.querylabels"/></remarks>
[Experimental(Experiments.Server_8_10, UrlFormat = Experiments.UrlFormat)]
Task<IReadOnlyList<string>> QueryLabelNamesAsync(IReadOnlyCollection<string>? filter = null);

/// <summary>
Expand All @@ -581,7 +579,6 @@ Task<IReadOnlyList<TimeSeriesTuple>> RevRangeAsync(string key,
/// <see cref="QueryIndexAsync"/> / MRANGE / MGET). When omitted or empty, all indexed series are queried.</param>
/// <returns>The distinct values of <paramref name="label"/>; the collection is unordered and may be empty.</returns>
/// <remarks><seealso href="https://redis.io/commands/ts.querylabels"/></remarks>
[Experimental(Experiments.Server_8_10, UrlFormat = Experiments.UrlFormat)]
Task<IReadOnlyList<string>> QueryLabelValuesAsync(string label, IReadOnlyCollection<string>? filter = null);

/// <summary>
Expand All @@ -605,7 +602,6 @@ Task<IReadOnlyList<TimeSeriesTuple>> RevRangeAsync(string key,
/// <param name="bt">Optional: controls how bucket timestamps are reported.</param>
/// <returns>The pivot rows; missing cells are <see cref="double.NaN"/>. May be empty.</returns>
/// <remarks><seealso href="https://redis.io/commands/ts.nrange"/></remarks>
[Experimental(Experiments.Server_8_10, UrlFormat = Experiments.UrlFormat)]
Task<IReadOnlyList<TimeSeriesPivotRow>> NRangeAsync(
IReadOnlyList<string> keys,
TimeStamp fromTimeStamp,
Expand Down Expand Up @@ -639,7 +635,6 @@ Task<IReadOnlyList<TimeSeriesPivotRow>> NRangeAsync(
/// <param name="bt">Optional: controls how bucket timestamps are reported.</param>
/// <returns>The pivot rows in reverse timestamp order; missing cells are <see cref="double.NaN"/>. May be empty.</returns>
/// <remarks><seealso href="https://redis.io/commands/ts.nrevrange"/></remarks>
[Experimental(Experiments.Server_8_10, UrlFormat = Experiments.UrlFormat)]
Task<IReadOnlyList<TimeSeriesPivotRow>> NRevRangeAsync(
IReadOnlyList<string> keys,
TimeStamp fromTimeStamp,
Expand All @@ -664,7 +659,6 @@ Task<IReadOnlyList<TimeSeriesPivotRow>> NRevRangeAsync(
/// <returns>The qualifying samples in ascending timestamp order; an empty list is a valid, successful reply.</returns>
/// <remarks>The server's BLOCK (wait-for-samples) mode is intentionally not exposed, as blocking does not
/// compose with the SE.Redis multiplexer. <seealso href="https://redis.io/commands/ts.read"/></remarks>
[Experimental(Experiments.Server_8_10, UrlFormat = Experiments.UrlFormat)]
Task<IReadOnlyList<TimeSeriesTuple>> ReadAsync(string key, TimeStamp timestamp, long? maxCount = null);

/// <summary>
Expand All @@ -678,7 +672,6 @@ Task<IReadOnlyList<TimeSeriesPivotRow>> NRevRangeAsync(
/// <param name="cancellationToken">Cancellation token, checked between pages.</param>
/// <returns>A lazy async sequence of samples; enumeration ends when a non-full page is reached.</returns>
/// <remarks><seealso href="https://redis.io/commands/ts.read"/></remarks>
[Experimental(Experiments.Server_8_10, UrlFormat = Experiments.UrlFormat)]
IAsyncEnumerable<TimeSeriesTuple> ReadAsyncEnumerable(string key, TimeStamp fromTimeStamp,
long? batchSize = null, CancellationToken cancellationToken = default);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
using System.Diagnostics.CodeAnalysis;

namespace NRedisStack.Literals.Enums;

Expand Down Expand Up @@ -43,6 +42,5 @@ public enum TimeSeriesRangeFlags
/// so combining this flag with a group-by results in the server error being propagated unchanged.
/// </para>
/// </summary>
[Experimental(Experiments.Server_8_10, UrlFormat = Experiments.UrlFormat)]
ExcludeEmpty = 1 << 3,
}
7 changes: 0 additions & 7 deletions src/NRedisStack/TimeSeries/TimeSeriesCommands.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
using NRedisStack.Literals.Enums;
using NRedisStack.DataTypes;
using System.ComponentModel;
using System.Diagnostics.CodeAnalysis;
using System.Runtime.CompilerServices;
namespace NRedisStack;

Expand Down Expand Up @@ -474,21 +473,18 @@ public IReadOnlyList<string> QueryIndex(IReadOnlyCollection<string> filter)
}

/// <inheritdoc/>
[Experimental(Experiments.Server_8_10, UrlFormat = Experiments.UrlFormat)]
public IReadOnlyList<string> QueryLabelNames(IReadOnlyCollection<string>? filter = null)
{
return _db.Execute(TimeSeriesCommandsBuilder.QueryLabelNames(filter)).ToStringList();
}

/// <inheritdoc/>
[Experimental(Experiments.Server_8_10, UrlFormat = Experiments.UrlFormat)]
public IReadOnlyList<string> QueryLabelValues(string label, IReadOnlyCollection<string>? filter = null)
{
return _db.Execute(TimeSeriesCommandsBuilder.QueryLabelValues(label, filter)).ToStringList();
}

/// <inheritdoc/>
[Experimental(Experiments.Server_8_10, UrlFormat = Experiments.UrlFormat)]
public IReadOnlyList<TimeSeriesPivotRow> NRange(
IReadOnlyList<string> keys,
TimeStamp fromTimeStamp,
Expand All @@ -507,7 +503,6 @@ public IReadOnlyList<TimeSeriesPivotRow> NRange(
}

/// <inheritdoc/>
[Experimental(Experiments.Server_8_10, UrlFormat = Experiments.UrlFormat)]
public IReadOnlyList<TimeSeriesPivotRow> NRevRange(
IReadOnlyList<string> keys,
TimeStamp fromTimeStamp,
Expand All @@ -526,14 +521,12 @@ public IReadOnlyList<TimeSeriesPivotRow> NRevRange(
}

/// <inheritdoc/>
[Experimental(Experiments.Server_8_10, UrlFormat = Experiments.UrlFormat)]
public IReadOnlyList<TimeSeriesTuple> Read(string key, TimeStamp timestamp, long? maxCount = null)
{
return _db.Execute(TimeSeriesCommandsBuilder.Read(key, timestamp, maxCount)).ToTimeSeriesTupleArray();
}

/// <inheritdoc/>
[Experimental(Experiments.Server_8_10, UrlFormat = Experiments.UrlFormat)]
public IEnumerable<TimeSeriesTuple> ReadEnumerable(string key, TimeStamp fromTimeStamp, long? batchSize = null)
{
TimeStamp cursor = fromTimeStamp;
Expand Down
7 changes: 0 additions & 7 deletions src/NRedisStack/TimeSeries/TimeSeriesCommandsAsync.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
using NRedisStack.Literals.Enums;
using NRedisStack.DataTypes;
using System.ComponentModel;
using System.Diagnostics.CodeAnalysis;
using System.Runtime.CompilerServices;
namespace NRedisStack;

Expand Down Expand Up @@ -480,21 +479,18 @@ public async Task<IReadOnlyList<string>> QueryIndexAsync(IReadOnlyCollection<str
}

/// <inheritdoc/>
[Experimental(Experiments.Server_8_10, UrlFormat = Experiments.UrlFormat)]
public async Task<IReadOnlyList<string>> QueryLabelNamesAsync(IReadOnlyCollection<string>? filter = null)
{
return (await _db.ExecuteAsync(TimeSeriesCommandsBuilder.QueryLabelNames(filter))).ToStringList();
}

/// <inheritdoc/>
[Experimental(Experiments.Server_8_10, UrlFormat = Experiments.UrlFormat)]
public async Task<IReadOnlyList<string>> QueryLabelValuesAsync(string label, IReadOnlyCollection<string>? filter = null)
{
return (await _db.ExecuteAsync(TimeSeriesCommandsBuilder.QueryLabelValues(label, filter))).ToStringList();
}

/// <inheritdoc/>
[Experimental(Experiments.Server_8_10, UrlFormat = Experiments.UrlFormat)]
public async Task<IReadOnlyList<TimeSeriesPivotRow>> NRangeAsync(
IReadOnlyList<string> keys,
TimeStamp fromTimeStamp,
Expand All @@ -513,7 +509,6 @@ public async Task<IReadOnlyList<TimeSeriesPivotRow>> NRangeAsync(
}

/// <inheritdoc/>
[Experimental(Experiments.Server_8_10, UrlFormat = Experiments.UrlFormat)]
public async Task<IReadOnlyList<TimeSeriesPivotRow>> NRevRangeAsync(
IReadOnlyList<string> keys,
TimeStamp fromTimeStamp,
Expand All @@ -532,14 +527,12 @@ public async Task<IReadOnlyList<TimeSeriesPivotRow>> NRevRangeAsync(
}

/// <inheritdoc/>
[Experimental(Experiments.Server_8_10, UrlFormat = Experiments.UrlFormat)]
public async Task<IReadOnlyList<TimeSeriesTuple>> ReadAsync(string key, TimeStamp timestamp, long? maxCount = null)
{
return (await _db.ExecuteAsync(TimeSeriesCommandsBuilder.Read(key, timestamp, maxCount))).ToTimeSeriesTupleArray();
}

/// <inheritdoc/>
[Experimental(Experiments.Server_8_10, UrlFormat = Experiments.UrlFormat)]
public async IAsyncEnumerable<TimeSeriesTuple> ReadAsyncEnumerable(string key, TimeStamp fromTimeStamp,
long? batchSize = null, [EnumeratorCancellation] CancellationToken cancellationToken = default)
{
Expand Down
6 changes: 0 additions & 6 deletions src/NRedisStack/TimeSeries/TimeSeriesCommandsBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
using NRedisStack.RedisStackCommands;
using StackExchange.Redis;
using System.ComponentModel;
using System.Diagnostics.CodeAnalysis;
using System.Runtime.CompilerServices;

namespace NRedisStack;
Expand Down Expand Up @@ -437,15 +436,13 @@ public static SerializedCommand QueryIndex(IReadOnlyCollection<string> filter)
return new(TS.QUERYINDEX, args);
}

[Experimental(Experiments.Server_8_10, UrlFormat = Experiments.UrlFormat)]
public static SerializedCommand QueryLabelNames(IReadOnlyCollection<string>? filter = null)
{
var args = new List<object> { TimeSeriesArgs.LABELS };
AddQueryLabelsFilter(args, filter);
return new(TS.QUERYLABELS, args);
}

[Experimental(Experiments.Server_8_10, UrlFormat = Experiments.UrlFormat)]
public static SerializedCommand QueryLabelValues(string label, IReadOnlyCollection<string>? filter = null)
{
var args = new List<object> { TimeSeriesArgs.VALUES, label };
Expand All @@ -464,7 +461,6 @@ private static void AddQueryLabelsFilter(List<object> args, IReadOnlyCollection<
}
}

[Experimental(Experiments.Server_8_10, UrlFormat = Experiments.UrlFormat)]
public static SerializedCommand NRange(
IReadOnlyList<string> keys,
TimeStamp fromTimeStamp,
Expand All @@ -483,7 +479,6 @@ public static SerializedCommand NRange(
return new(TS.NRANGE, args);
}

[Experimental(Experiments.Server_8_10, UrlFormat = Experiments.UrlFormat)]
public static SerializedCommand NRevRange(
IReadOnlyList<string> keys,
TimeStamp fromTimeStamp,
Expand All @@ -504,7 +499,6 @@ public static SerializedCommand NRevRange(

// Note: the server's BLOCK group is intentionally not exposed - blocking does not compose with the
// SE.Redis multiplexer - so this only ever builds the immediate-return form.
[Experimental(Experiments.Server_8_10, UrlFormat = Experiments.UrlFormat)]
public static SerializedCommand Read(string key, TimeStamp timestamp, long? maxCount = null)
Comment thread
mgravell marked this conversation as resolved.
Resolved
{
var args = new List<object> { (RedisKey)key, timestamp.Value };
Expand Down
Loading