From 89ccbe990f2d6b042fef4f4d88f2dfae9700a124 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Mon, 2 Feb 2026 17:53:43 -0500 Subject: [PATCH] add AND / OR support when filtering --- Svrnty.CQRS.Grpc.Generators/GrpcGenerator.cs | 6 ++- Svrnty.Sample/Protos/cqrs_services.proto | 50 ++++++++++++++++++++ 2 files changed, 54 insertions(+), 2 deletions(-) diff --git a/Svrnty.CQRS.Grpc.Generators/GrpcGenerator.cs b/Svrnty.CQRS.Grpc.Generators/GrpcGenerator.cs index e6b7c87..f090b30 100644 --- a/Svrnty.CQRS.Grpc.Generators/GrpcGenerator.cs +++ b/Svrnty.CQRS.Grpc.Generators/GrpcGenerator.cs @@ -2864,7 +2864,8 @@ namespace Svrnty.CQRS.Grpc.Generators sb.AppendLine(" {"); sb.AppendLine(" Path = protoFilter.Path,"); sb.AppendLine(" Type = ((PoweredSoft.DynamicQuery.Core.FilterType)protoFilter.Type).ToString(),"); - sb.AppendLine(" Value = protoFilter.Value"); + sb.AppendLine(" Value = protoFilter.Value,"); + sb.AppendLine(" And = true"); sb.AppendLine(" };"); sb.AppendLine(); sb.AppendLine(" // Handle nested AND filters"); @@ -2894,7 +2895,8 @@ namespace Svrnty.CQRS.Grpc.Generators sb.AppendLine(" {"); sb.AppendLine(" Path = pf.Path,"); sb.AppendLine(" Type = ((PoweredSoft.DynamicQuery.Core.FilterType)pf.Type).ToString(),"); - sb.AppendLine(" Value = pf.Value"); + sb.AppendLine(" Value = pf.Value,"); + sb.AppendLine(" And = true"); sb.AppendLine(" };"); sb.AppendLine(" if (pf.And != null && pf.And.Count > 0)"); sb.AppendLine(" {"); diff --git a/Svrnty.Sample/Protos/cqrs_services.proto b/Svrnty.Sample/Protos/cqrs_services.proto index b84bd32..10bad1c 100644 --- a/Svrnty.Sample/Protos/cqrs_services.proto +++ b/Svrnty.Sample/Protos/cqrs_services.proto @@ -21,6 +21,13 @@ service QueryService { } +// DynamicQuery service for CQRS operations +service DynamicQueryService { + // Dynamic query for User + rpc QueryUsers (DynamicQueryUsersRequest) returns (DynamicQueryUsersResponse); + +} + // Request message for AddUserCommand message AddUserCommandRequest { string name = 1; @@ -59,3 +66,46 @@ message User { string email = 3; } +// Dynamic query filter with AND/OR support +message DynamicQueryFilter { + string path = 1; + int32 type = 2; // PoweredSoft.DynamicQuery.Core.FilterType + string value = 3; + repeated DynamicQueryFilter and = 4; + repeated DynamicQueryFilter or = 5; +} + +// Dynamic query sort +message DynamicQuerySort { + string path = 1; + bool ascending = 2; +} + +// Dynamic query group +message DynamicQueryGroup { + string path = 1; +} + +// Dynamic query aggregate +message DynamicQueryAggregate { + string path = 1; + int32 type = 2; // PoweredSoft.DynamicQuery.Core.AggregateType +} + +// Dynamic query request for User +message DynamicQueryUsersRequest { + int32 page = 1; + int32 page_size = 2; + repeated DynamicQueryFilter filters = 3; + repeated DynamicQuerySort sorts = 4; + repeated DynamicQueryGroup groups = 5; + repeated DynamicQueryAggregate aggregates = 6; +} + +// Dynamic query response for User +message DynamicQueryUsersResponse { + repeated User data = 1; + int64 total_records = 2; + int32 number_of_pages = 3; +} +