-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathcompose.go
More file actions
68 lines (63 loc) · 2.87 KB
/
compose.go
File metadata and controls
68 lines (63 loc) · 2.87 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
// SPDX-FileCopyrightText: 2024 Greenbone AG <https://greenbone.net>
//
// SPDX-License-Identifier: AGPL-3.0-or-later
package query
import (
"fmt"
"maps"
"slices"
"github.com/greenbone/opensight-golang-libraries/pkg/query/filter"
)
// composeQuery takes a filter request field and translates it into a SQL query condition
// which can be used in a WHERE clause.
func composeQuery(
fieldMapping map[string]string, // Mapping of field names to database column names
field filter.RequestField, // The filter request field containing the field name and operator
) (
conditionTemplate string, // Template for the SQL condition
err error, // Error encountered during execution
) {
// translate filter field to database column name if field mapping exists
dbColumnName, ok := fieldMapping[field.Name]
if !ok {
return "", filter.NewInvalidFilterFieldError(
"invalid filter field '%s', available fields: ",
slices.Collect(maps.Keys(fieldMapping)))
}
quotedName, err := getQuotedName(dbColumnName)
if err != nil {
return "", fmt.Errorf("failed to parse quoted name of field %s: %w", field.Name, err)
}
field.Name = quotedName
switch field.Operator {
case filter.CompareOperatorIsEqualTo:
conditionTemplate, err = buildComparisonStatementSimple(field, false, "=")
case filter.CompareOperatorIsNotEqualTo:
conditionTemplate, err = buildComparisonStatementSimple(field, true, "=")
case filter.CompareOperatorIsLessThan:
conditionTemplate, err = buildComparisonStatementSimple(field, false, "<")
case filter.CompareOperatorIsLessThanOrEqualTo:
conditionTemplate, err = buildComparisonStatementSimple(field, false, "<=")
case filter.CompareOperatorIsGreaterThan:
conditionTemplate, err = buildComparisonStatementSimple(field, false, ">")
case filter.CompareOperatorIsGreaterThanOrEqualTo:
conditionTemplate, err = buildComparisonStatementSimple(field, false, ">=")
case filter.CompareOperatorContains:
conditionTemplate, err = buildStringComparisonStatement(field, false, "ILIKE", `'%' || ? || '%'`)
case filter.CompareOperatorDoesNotContain:
conditionTemplate, err = buildStringComparisonStatement(field, true, "ILIKE", `'%' || ? || '%'`)
case filter.CompareOperatorBeginsWith:
conditionTemplate, err = buildStringComparisonStatement(field, false, "ILIKE", `? || '%'`)
case filter.CompareOperatorDoesNotBeginWith:
conditionTemplate, err = buildStringComparisonStatement(field, true, "ILIKE", `? || '%'`)
case filter.CompareOperatorIsStringCaseInsensitiveEqualTo:
conditionTemplate, err = buildStringComparisonStatement(field, false, "ILIKE", "?")
case filter.CompareOperatorBeforeDate:
conditionTemplate, err = buildDateTruncStatement(field, "<")
case filter.CompareOperatorAfterDate:
conditionTemplate, err = buildDateTruncStatement(field, ">")
default:
err = fmt.Errorf("field '%s' with unknown operator '%s'", field.Name, field.Operator)
}
return conditionTemplate, err
}