diff --git a/pkg/coredata/measure_filter.go b/pkg/coredata/measure_filter.go index fa6e0cce9..1133e0e94 100644 --- a/pkg/coredata/measure_filter.go +++ b/pkg/coredata/measure_filter.go @@ -21,30 +21,45 @@ import ( type ( MeasureFilter struct { query *string + state *MeasureState } ) -func NewMeasureFilter(query *string) *MeasureFilter { +func NewMeasureFilter(query *string, state *MeasureState) *MeasureFilter { return &MeasureFilter{ query: query, + state: state, } } func (f *MeasureFilter) SQLArguments() pgx.NamedArgs { return pgx.NamedArgs{ "query": f.query, + "state": f.state, } } func (f *MeasureFilter) SQLFragment() string { - if f.query == nil || *f.query == "" { - return "TRUE" - } - return ` - search_vector @@ ( - SELECT to_tsquery('simple', string_agg(lexeme || ':*', ' & ')) - FROM unnest(regexp_split_to_array(trim(@query), '\s+')) AS lexeme +( + CASE + WHEN @query::text IS NULL OR @query::text = '' THEN + TRUE + ELSE + search_vector @@ ( + SELECT to_tsquery('simple', string_agg(lexeme || ':*', ' & ')) + FROM unnest(regexp_split_to_array(trim(@query), '\s+')) AS lexeme + ) + END +) +AND +( + CASE + WHEN @state::mitigation_state IS NULL THEN + TRUE + ELSE + state = @state::mitigation_state + END ) ` } diff --git a/pkg/probo/framework_service.go b/pkg/probo/framework_service.go index c610cccfc..17db88455 100644 --- a/pkg/probo/framework_service.go +++ b/pkg/probo/framework_service.go @@ -188,7 +188,7 @@ func (s FrameworkService) Export( Direction: page.OrderDirectionAsc, }, ), - coredata.NewMeasureFilter(nil), + coredata.NewMeasureFilter(nil, nil), ) if err != nil { return fmt.Errorf("cannot load measures: %w", err) @@ -603,7 +603,7 @@ func (s FrameworkService) StateOfApplicability(ctx context.Context, frameworkID Direction: page.OrderDirectionAsc, }, ), - coredata.NewMeasureFilter(nil), + coredata.NewMeasureFilter(nil, nil), ) if err != nil { return fmt.Errorf("cannot load measures: %w", err) diff --git a/pkg/server/api/console/v1/schema.graphql b/pkg/server/api/console/v1/schema.graphql index beb57787d..946641ad0 100644 --- a/pkg/server/api/console/v1/schema.graphql +++ b/pkg/server/api/console/v1/schema.graphql @@ -1425,6 +1425,7 @@ input DocumentFilter { input MeasureFilter { query: String + state: MeasureState } input RiskFilter { diff --git a/pkg/server/api/console/v1/schema/schema.go b/pkg/server/api/console/v1/schema/schema.go index f22d86819..917d25d46 100644 --- a/pkg/server/api/console/v1/schema/schema.go +++ b/pkg/server/api/console/v1/schema/schema.go @@ -10142,6 +10142,7 @@ input DocumentFilter { input MeasureFilter { query: String + state: MeasureState } input RiskFilter { @@ -69569,7 +69570,7 @@ func (ec *executionContext) unmarshalInputMeasureFilter(ctx context.Context, obj asMap[k] = v } - fieldsInOrder := [...]string{"query"} + fieldsInOrder := [...]string{"query", "state"} for _, k := range fieldsInOrder { v, ok := asMap[k] if !ok { @@ -69583,6 +69584,13 @@ func (ec *executionContext) unmarshalInputMeasureFilter(ctx context.Context, obj return it, err } it.Query = data + case "state": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("state")) + data, err := ec.unmarshalOMeasureState2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋcoredataᚐMeasureState(ctx, v) + if err != nil { + return it, err + } + it.State = data } } diff --git a/pkg/server/api/console/v1/types/types.go b/pkg/server/api/console/v1/types/types.go index 03a2858ea..d764c7c1f 100644 --- a/pkg/server/api/console/v1/types/types.go +++ b/pkg/server/api/console/v1/types/types.go @@ -1220,7 +1220,8 @@ type MeasureEdge struct { } type MeasureFilter struct { - Query *string `json:"query,omitempty"` + Query *string `json:"query,omitempty"` + State *coredata.MeasureState `json:"state,omitempty"` } type Mutation struct { diff --git a/pkg/server/api/console/v1/v1_resolver.go b/pkg/server/api/console/v1/v1_resolver.go index 3d6ff1f1f..517b27bc8 100644 --- a/pkg/server/api/console/v1/v1_resolver.go +++ b/pkg/server/api/console/v1/v1_resolver.go @@ -314,9 +314,9 @@ func (r *controlResolver) Measures(ctx context.Context, obj *types.Control, firs cursor := types.NewCursor(first, after, last, before, pageOrderBy) - var measureFilter = coredata.NewMeasureFilter(nil) + var measureFilter = coredata.NewMeasureFilter(nil, nil) if filter != nil { - measureFilter = coredata.NewMeasureFilter(filter.Query) + measureFilter = coredata.NewMeasureFilter(filter.Query, filter.State) } page, err := prb.Measures.ListForControlID(ctx, obj.ID, cursor, measureFilter) @@ -3709,9 +3709,9 @@ func (r *organizationResolver) Measures(ctx context.Context, obj *types.Organiza cursor := types.NewCursor(first, after, last, before, pageOrderBy) - var measureFilter = coredata.NewMeasureFilter(nil) + var measureFilter = coredata.NewMeasureFilter(nil, nil) if filter != nil { - measureFilter = coredata.NewMeasureFilter(filter.Query) + measureFilter = coredata.NewMeasureFilter(filter.Query, filter.State) } page, err := prb.Measures.ListForOrganizationID(ctx, obj.ID, cursor, measureFilter) @@ -4353,9 +4353,9 @@ func (r *riskResolver) Measures(ctx context.Context, obj *types.Risk, first *int cursor := types.NewCursor(first, after, last, before, pageOrderBy) - var measureFilter = coredata.NewMeasureFilter(nil) + var measureFilter = coredata.NewMeasureFilter(nil, nil) if filter != nil { - measureFilter = coredata.NewMeasureFilter(filter.Query) + measureFilter = coredata.NewMeasureFilter(filter.Query, filter.State) } page, err := prb.Measures.ListForRiskID(ctx, obj.ID, cursor, measureFilter)