diff --git a/pkg/kql/cast.go b/pkg/kql/cast.go index ecd0cac27f..fd2eeadeac 100644 --- a/pkg/kql/cast.go +++ b/pkg/kql/cast.go @@ -7,7 +7,6 @@ import ( "github.com/jinzhu/now" "github.com/opencloud-eu/opencloud/pkg/ast" - "github.com/opencloud-eu/opencloud/services/search/pkg/query" ) func toNode[T ast.Node](in any) (T, error) { @@ -85,7 +84,7 @@ func toTimeRange(in any) (*time.Time, *time.Time, error) { value, err := toString(in) if err != nil { - return &from, &to, &query.UnsupportedTimeRangeError{} + return &from, &to, &UnsupportedTimeRangeError{} } c := &now.Config{ @@ -132,7 +131,7 @@ func toTimeRange(in any) (*time.Time, *time.Time, error) { } if from.IsZero() || to.IsZero() { - return nil, nil, &query.UnsupportedTimeRangeError{} + return nil, nil, &UnsupportedTimeRangeError{} } return &from, &to, nil diff --git a/pkg/kql/dictionary_test.go b/pkg/kql/dictionary_test.go index 25f6e2f902..a49d16dc18 100644 --- a/pkg/kql/dictionary_test.go +++ b/pkg/kql/dictionary_test.go @@ -9,7 +9,6 @@ import ( "github.com/opencloud-eu/opencloud/pkg/ast" "github.com/opencloud-eu/opencloud/pkg/ast/test" "github.com/opencloud-eu/opencloud/pkg/kql" - "github.com/opencloud-eu/opencloud/services/search/pkg/query" tAssert "github.com/stretchr/testify/assert" ) @@ -34,13 +33,13 @@ func TestParse_Spec(t *testing.T) { }, { name: `AND`, - error: query.StartsWithBinaryOperatorError{ + error: kql.StartsWithBinaryOperatorError{ Node: &ast.OperatorNode{Value: kql.BoolAND}, }, }, { name: `AND cat AND dog`, - error: query.StartsWithBinaryOperatorError{ + error: kql.StartsWithBinaryOperatorError{ Node: &ast.OperatorNode{Value: kql.BoolAND}, }, }, @@ -80,13 +79,13 @@ func TestParse_Spec(t *testing.T) { }, { name: `OR`, - error: query.StartsWithBinaryOperatorError{ + error: kql.StartsWithBinaryOperatorError{ Node: &ast.OperatorNode{Value: kql.BoolOR}, }, }, { name: `OR cat AND dog`, - error: query.StartsWithBinaryOperatorError{ + error: kql.StartsWithBinaryOperatorError{ Node: &ast.OperatorNode{Value: kql.BoolOR}, }, }, @@ -930,37 +929,37 @@ func TestParse_Errors(t *testing.T) { tests := []testCase{ { query: "animal:(mammal:cat mammal:dog reptile:turtle)", - error: query.NamedGroupInvalidNodesError{ + error: kql.NamedGroupInvalidNodesError{ Node: &ast.StringNode{Key: "mammal", Value: "cat"}, }, }, { query: "animal:(cat mammal:dog turtle)", - error: query.NamedGroupInvalidNodesError{ + error: kql.NamedGroupInvalidNodesError{ Node: &ast.StringNode{Key: "mammal", Value: "dog"}, }, }, { query: "animal:(AND cat)", - error: query.StartsWithBinaryOperatorError{ + error: kql.StartsWithBinaryOperatorError{ Node: &ast.OperatorNode{Value: kql.BoolAND}, }, }, { query: "animal:(OR cat)", - error: query.StartsWithBinaryOperatorError{ + error: kql.StartsWithBinaryOperatorError{ Node: &ast.OperatorNode{Value: kql.BoolOR}, }, }, { query: "(AND cat)", - error: query.StartsWithBinaryOperatorError{ + error: kql.StartsWithBinaryOperatorError{ Node: &ast.OperatorNode{Value: kql.BoolAND}, }, }, { query: "(OR cat)", - error: query.StartsWithBinaryOperatorError{ + error: kql.StartsWithBinaryOperatorError{ Node: &ast.OperatorNode{Value: kql.BoolOR}, }, }, diff --git a/services/search/pkg/query/error.go b/pkg/kql/error.go similarity index 86% rename from services/search/pkg/query/error.go rename to pkg/kql/error.go index 27fde9541e..47009001b3 100644 --- a/services/search/pkg/query/error.go +++ b/pkg/kql/error.go @@ -1,4 +1,4 @@ -package query +package kql import ( "errors" @@ -39,8 +39,9 @@ func (e UnsupportedTimeRangeError) Error() string { return fmt.Sprintf("unable to convert '%v' to a time range", e.Value) } -// IsValidationError says whether the query itself is at fault, which makes it a -// bad request and not an error of ours. +// IsValidationError reports whether err is one of the KQL parse/validation +// errors produced by this package, i.e. the query itself is at fault and the +// caller should treat it as a bad request. func IsValidationError(err error) bool { var ( startsWithBinaryOperator *StartsWithBinaryOperatorError diff --git a/pkg/kql/kql_test.go b/pkg/kql/kql_test.go index d3b745ca3f..d90245ccf3 100644 --- a/pkg/kql/kql_test.go +++ b/pkg/kql/kql_test.go @@ -5,7 +5,6 @@ import ( "github.com/opencloud-eu/opencloud/pkg/ast" "github.com/opencloud-eu/opencloud/pkg/kql" - "github.com/opencloud-eu/opencloud/services/search/pkg/query" tAssert "github.com/stretchr/testify/assert" ) @@ -22,7 +21,7 @@ func TestNewAST(t *testing.T) { { name: "error", givenQuery: kql.BoolAND, - expectedError: query.StartsWithBinaryOperatorError{ + expectedError: kql.StartsWithBinaryOperatorError{ Node: &ast.OperatorNode{Value: kql.BoolAND}, }, }, diff --git a/pkg/kql/validate.go b/pkg/kql/validate.go index 56bf681887..1f7e38ccba 100644 --- a/pkg/kql/validate.go +++ b/pkg/kql/validate.go @@ -2,7 +2,6 @@ package kql import ( "github.com/opencloud-eu/opencloud/pkg/ast" - "github.com/opencloud-eu/opencloud/services/search/pkg/query" ) func validateAst(a *ast.Ast) error { @@ -10,7 +9,7 @@ func validateAst(a *ast.Ast) error { case *ast.OperatorNode: switch node.Value { case BoolAND, BoolOR: - return &query.StartsWithBinaryOperatorError{Node: node} + return &StartsWithBinaryOperatorError{Node: node} } } return nil @@ -21,14 +20,14 @@ func validateGroupNode(n *ast.GroupNode) error { case *ast.OperatorNode: switch node.Value { case BoolAND, BoolOR: - return &query.StartsWithBinaryOperatorError{Node: node} + return &StartsWithBinaryOperatorError{Node: node} } } if n.Key != "" { for _, node := range n.Nodes { if ast.NodeKey(node) != "" { - return &query.NamedGroupInvalidNodesError{Node: node} + return &NamedGroupInvalidNodesError{Node: node} } } } diff --git a/services/search/pkg/bleve/backend.go b/services/search/pkg/bleve/backend.go index eda67ead85..e325d81261 100644 --- a/services/search/pkg/bleve/backend.go +++ b/services/search/pkg/bleve/backend.go @@ -14,6 +14,7 @@ import ( "github.com/opencloud-eu/reva/v2/pkg/utils" "google.golang.org/protobuf/types/known/timestamppb" + "github.com/opencloud-eu/opencloud/pkg/kql" "github.com/opencloud-eu/opencloud/pkg/log" "github.com/opencloud-eu/opencloud/services/search/pkg/search" @@ -45,7 +46,7 @@ func NewBackend(index bleve.Index, queryCreator searchQuery.Creator[query.Query] func (b *Backend) Search(_ context.Context, sir *searchService.SearchIndexRequest) (*searchService.SearchIndexResponse, error) { createdQuery, err := b.queryCreator.Create(sir.Query) if err != nil { - if searchQuery.IsValidationError(err) { + if kql.IsValidationError(err) { return nil, errtypes.BadRequest(err.Error()) } return nil, err diff --git a/services/search/pkg/opensearch/backend.go b/services/search/pkg/opensearch/backend.go index ef6d25c031..93433f502a 100644 --- a/services/search/pkg/opensearch/backend.go +++ b/services/search/pkg/opensearch/backend.go @@ -14,11 +14,11 @@ import ( "github.com/opencloud-eu/reva/v2/pkg/utils" "github.com/opencloud-eu/opencloud/pkg/conversions" + "github.com/opencloud-eu/opencloud/pkg/kql" searchMessage "github.com/opencloud-eu/opencloud/protogen/gen/opencloud/messages/search/v0" searchService "github.com/opencloud-eu/opencloud/protogen/gen/opencloud/services/search/v0" "github.com/opencloud-eu/opencloud/services/search/pkg/opensearch/internal/convert" "github.com/opencloud-eu/opencloud/services/search/pkg/opensearch/internal/osu" - searchQuery "github.com/opencloud-eu/opencloud/services/search/pkg/query" "github.com/opencloud-eu/opencloud/services/search/pkg/search" ) @@ -74,7 +74,7 @@ func NewBackend(name string, client *opensearchgoAPI.Client) (*Backend, error) { func (b *Backend) Search(ctx context.Context, sir *searchService.SearchIndexRequest) (*searchService.SearchIndexResponse, error) { boolQuery, err := convert.KQLToOpenSearchBoolQuery(sir.Query) switch { - case searchQuery.IsValidationError(err): + case kql.IsValidationError(err): return nil, errtypes.BadRequest(err.Error()) case err != nil: return nil, fmt.Errorf("failed to convert KQL query to OpenSearch bool query: %w", err)