Skip to content

Commit

Permalink
Added queryExpiration option to Redis query cache. (#4930)
Browse files Browse the repository at this point in the history
  • Loading branch information
gkfischer authored and michaelstaib committed Apr 5, 2022
1 parent ff3d482 commit ac11fb4
Show file tree
Hide file tree
Showing 9 changed files with 901 additions and 763 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,169 +4,181 @@
using HotChocolate.Execution.Configuration;
using HotChocolate;

namespace Microsoft.Extensions.DependencyInjection
namespace Microsoft.Extensions.DependencyInjection;

/// <summary>
/// Provides utility methods to setup dependency injection.
/// </summary>
public static class HotChocolateRedisPersistedQueriesRequestExecutorBuilderExtensions
{
/// <summary>
/// Provides utility methods to setup dependency injection.
/// Adds a redis read and write query storage to the
/// services collection.
/// </summary>
public static class HotChocolateRedisPersistedQueriesRequestExecutorBuilderExtensions
/// <param name="builder">
/// The service collection to which the services are added.
/// </param>
/// <param name="databaseFactory">
/// A factory that resolves the redis database that
/// shall be used for persistence.
/// </param>
/// <param name="queryExpiration">
/// A timeout after which a query is removed from the Redis cache.
/// </param>
public static IRequestExecutorBuilder AddRedisQueryStorage(
this IRequestExecutorBuilder builder,
Func<IServiceProvider, IDatabase> databaseFactory,
TimeSpan? queryExpiration = null)
{
/// <summary>
/// Adds a redis read and write query storage to the
/// services collection.
/// </summary>
/// <param name="builder">
/// The service collection to which the services are added.
/// </param>
/// <param name="databaseFactory">
/// A factory that resolves the redis database that
/// shall be used for persistence.
/// </param>
public static IRequestExecutorBuilder AddRedisQueryStorage(
this IRequestExecutorBuilder builder,
Func<IServiceProvider, IDatabase> databaseFactory)
if (builder is null)
{
if (builder is null)
{
throw new ArgumentNullException(nameof(builder));
}

if (databaseFactory is null)
{
throw new ArgumentNullException(nameof(databaseFactory));
}

return builder.ConfigureSchemaServices(
s => s.AddRedisQueryStorage(sp => databaseFactory(sp.GetCombinedServices())));
throw new ArgumentNullException(nameof(builder));
}

/// <summary>
/// Adds a redis read and write query storage to the
/// services collection.
/// </summary>
/// <param name="builder">
/// The service collection to which the services are added.
/// </param>
/// <param name="multiplexerFactory">
/// A factory that resolves the redis connection multiplexer.
/// </param>
public static IRequestExecutorBuilder AddRedisQueryStorage(
this IRequestExecutorBuilder builder,
Func<IServiceProvider, IConnectionMultiplexer> multiplexerFactory)
if (databaseFactory is null)
{
if (builder is null)
{
throw new ArgumentNullException(nameof(builder));
}

if (multiplexerFactory is null)
{
throw new ArgumentNullException(nameof(multiplexerFactory));
}

return builder.ConfigureSchemaServices(
s => s.AddRedisQueryStorage(
sp => multiplexerFactory(sp.GetCombinedServices()).GetDatabase()));
throw new ArgumentNullException(nameof(databaseFactory));
}

/// <summary>
/// Adds a redis read and write query storage to the
/// services collection and uses the first <see cref="IConnectionMultiplexer"/>
/// registered on the application services.
/// </summary>
/// <param name="builder">
/// The service collection to which the services are added.
/// </param>
public static IRequestExecutorBuilder AddRedisQueryStorage(
this IRequestExecutorBuilder builder)
return builder.ConfigureSchemaServices(
s => s.AddRedisQueryStorage(
sp => databaseFactory(sp.GetCombinedServices()),
queryExpiration));
}

/// <summary>
/// Adds a redis read and write query storage to the
/// services collection.
/// </summary>
/// <param name="builder">
/// The service collection to which the services are added.
/// </param>
/// <param name="multiplexerFactory">
/// A factory that resolves the redis connection multiplexer.
/// </param>
/// <param name="queryExpiration">
/// A timeout after which a query is removed from the Redis cache.
/// </param>
public static IRequestExecutorBuilder AddRedisQueryStorage(
this IRequestExecutorBuilder builder,
Func<IServiceProvider, IConnectionMultiplexer> multiplexerFactory,
TimeSpan? queryExpiration = null)
{
if (builder is null)
{
if (builder is null)
{
throw new ArgumentNullException(nameof(builder));
}
throw new ArgumentNullException(nameof(builder));
}

return builder.AddRedisQueryStorage(
sp => sp.GetRequiredService<IConnectionMultiplexer>());
if (multiplexerFactory is null)
{
throw new ArgumentNullException(nameof(multiplexerFactory));
}

/// <summary>
/// Adds a redis read-only query storage to the services collection.
/// </summary>
/// <param name="builder">
/// The service collection to which the services are added.
/// </param>
/// <param name="databaseFactory">
/// A factory that resolves the redis database that
/// shall be used for persistence.
/// </param>
public static IRequestExecutorBuilder AddReadOnlyRedisQueryStorage(
this IRequestExecutorBuilder builder,
Func<IServiceProvider, IDatabase> databaseFactory)
return builder.ConfigureSchemaServices(
s => s.AddRedisQueryStorage(
sp => multiplexerFactory(sp.GetCombinedServices()).GetDatabase(),
queryExpiration));
}

/// <summary>
/// Adds a redis read and write query storage to the
/// services collection and uses the first <see cref="IConnectionMultiplexer"/>
/// registered on the application services.
/// </summary>
/// <param name="builder">
/// The service collection to which the services are added.
/// </param>
/// <param name="queryExpiration">
/// A timeout after which a query is removed from the Redis cache.
/// </param>
public static IRequestExecutorBuilder AddRedisQueryStorage(
this IRequestExecutorBuilder builder,
TimeSpan? queryExpiration = null)
{
if (builder is null)
{
if (builder is null)
{
throw new ArgumentNullException(nameof(builder));
}

if (databaseFactory is null)
{
throw new ArgumentNullException(nameof(databaseFactory));
}

return builder.ConfigureSchemaServices(
s => s.AddReadOnlyRedisQueryStorage(
sp => databaseFactory(sp.GetCombinedServices())));
throw new ArgumentNullException(nameof(builder));
}

/// <summary>
/// Adds a redis read-only query storage to the services collection.
/// </summary>
/// <param name="builder">
/// The service collection to which the services are added.
/// </param>
/// <param name="multiplexerFactory">
/// A factory that resolves the redis connection multiplexer.
/// </param>
public static IRequestExecutorBuilder AddReadOnlyRedisQueryStorage(
this IRequestExecutorBuilder builder,
Func<IServiceProvider, IConnectionMultiplexer> multiplexerFactory)
return builder.AddRedisQueryStorage(
sp => sp.GetRequiredService<IConnectionMultiplexer>(),
queryExpiration);
}

/// <summary>
/// Adds a redis read-only query storage to the services collection.
/// </summary>
/// <param name="builder">
/// The service collection to which the services are added.
/// </param>
/// <param name="databaseFactory">
/// A factory that resolves the redis database that
/// shall be used for persistence.
/// </param>
public static IRequestExecutorBuilder AddReadOnlyRedisQueryStorage(
this IRequestExecutorBuilder builder,
Func<IServiceProvider, IDatabase> databaseFactory)
{
if (builder is null)
{
if (builder is null)
{
throw new ArgumentNullException(nameof(builder));
}

if (multiplexerFactory is null)
{
throw new ArgumentNullException(nameof(multiplexerFactory));
}

return builder.ConfigureSchemaServices(
s => s.AddReadOnlyRedisQueryStorage(
sp => multiplexerFactory(sp.GetCombinedServices()).GetDatabase()));
throw new ArgumentNullException(nameof(builder));
}

/// <summary>
/// Adds a redis read-only query storage to the services collection
/// and uses the first <see cref="IConnectionMultiplexer"/>
/// registered on the application services.
/// </summary>
/// <param name="builder">
/// The service collection to which the services are added.
/// </param>
/// <param name="multiplexerFactory">
/// A factory that resolves the redis connection multiplexer.
/// </param>
public static IRequestExecutorBuilder AddReadOnlyRedisQueryStorage(
this IRequestExecutorBuilder builder)
if (databaseFactory is null)
{
if (builder is null)
{
throw new ArgumentNullException(nameof(builder));
}
throw new ArgumentNullException(nameof(databaseFactory));
}

return builder.AddReadOnlyRedisQueryStorage(
sp => sp.GetRequiredService<IConnectionMultiplexer>());
return builder.ConfigureSchemaServices(
s => s.AddReadOnlyRedisQueryStorage(
sp => databaseFactory(sp.GetCombinedServices())));
}

/// <summary>
/// Adds a redis read-only query storage to the services collection.
/// </summary>
/// <param name="builder">
/// The service collection to which the services are added.
/// </param>
/// <param name="multiplexerFactory">
/// A factory that resolves the redis connection multiplexer.
/// </param>
public static IRequestExecutorBuilder AddReadOnlyRedisQueryStorage(
this IRequestExecutorBuilder builder,
Func<IServiceProvider, IConnectionMultiplexer> multiplexerFactory)
{
if (builder is null)
{
throw new ArgumentNullException(nameof(builder));
}

if (multiplexerFactory is null)
{
throw new ArgumentNullException(nameof(multiplexerFactory));
}

return builder.ConfigureSchemaServices(
s => s.AddReadOnlyRedisQueryStorage(
sp => multiplexerFactory(sp.GetCombinedServices()).GetDatabase()));
}

/// <summary>
/// Adds a redis read-only query storage to the services collection
/// and uses the first <see cref="IConnectionMultiplexer"/>
/// registered on the application services.
/// </summary>
/// <param name="builder">
/// The service collection to which the services are added.
/// </param>
public static IRequestExecutorBuilder AddReadOnlyRedisQueryStorage(
this IRequestExecutorBuilder builder)
{
if (builder is null)
{
throw new ArgumentNullException(nameof(builder));
}

return builder.AddReadOnlyRedisQueryStorage(
sp => sp.GetRequiredService<IConnectionMultiplexer>());
}
}
Loading

0 comments on commit ac11fb4

Please sign in to comment.