|
|
|
|
@@ -495,32 +495,32 @@ func TestFilterExprLogs(t *testing.T) {
|
|
|
|
|
category: "FREETEXT with parentheses",
|
|
|
|
|
query: "error (status.code=500 OR status.code=503)",
|
|
|
|
|
shouldPass: true,
|
|
|
|
|
expectedQuery: "WHERE (match(LOWER(body), LOWER(?)) AND (((toFloat64(attributes_number['status.code']) = ? AND mapContains(attributes_number, 'status.code')) OR (toFloat64(attributes_number['status.code']) = ? AND mapContains(attributes_number, 'status.code')))))",
|
|
|
|
|
expectedArgs: []any{"error", float64(500), float64(503)},
|
|
|
|
|
expectedQuery: "WHERE (match(LOWER(body), LOWER(?)) AND ((((toFloat64(attributes_number['status.code']) = ? AND has(mapValues(attributes_number), ?)) AND mapContains(attributes_number, 'status.code')) OR ((toFloat64(attributes_number['status.code']) = ? AND has(mapValues(attributes_number), ?)) AND mapContains(attributes_number, 'status.code')))))",
|
|
|
|
|
expectedArgs: []any{"error", float64(500), float64(500), float64(503), float64(503)},
|
|
|
|
|
expectedErrorContains: "",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
category: "FREETEXT with parentheses",
|
|
|
|
|
query: "(status.code=500 OR status.code=503) error",
|
|
|
|
|
shouldPass: true,
|
|
|
|
|
expectedQuery: "WHERE ((((toFloat64(attributes_number['status.code']) = ? AND mapContains(attributes_number, 'status.code')) OR (toFloat64(attributes_number['status.code']) = ? AND mapContains(attributes_number, 'status.code')))) AND match(LOWER(body), LOWER(?)))",
|
|
|
|
|
expectedArgs: []any{float64(500), float64(503), "error"},
|
|
|
|
|
expectedQuery: "WHERE (((((toFloat64(attributes_number['status.code']) = ? AND has(mapValues(attributes_number), ?)) AND mapContains(attributes_number, 'status.code')) OR ((toFloat64(attributes_number['status.code']) = ? AND has(mapValues(attributes_number), ?)) AND mapContains(attributes_number, 'status.code')))) AND match(LOWER(body), LOWER(?)))",
|
|
|
|
|
expectedArgs: []any{float64(500), float64(500), float64(503), float64(503), "error"},
|
|
|
|
|
expectedErrorContains: "",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
category: "FREETEXT with parentheses",
|
|
|
|
|
query: "error AND (status.code=500 OR status.code=503)",
|
|
|
|
|
shouldPass: true,
|
|
|
|
|
expectedQuery: "WHERE (match(LOWER(body), LOWER(?)) AND (((toFloat64(attributes_number['status.code']) = ? AND mapContains(attributes_number, 'status.code')) OR (toFloat64(attributes_number['status.code']) = ? AND mapContains(attributes_number, 'status.code')))))",
|
|
|
|
|
expectedArgs: []any{"error", float64(500), float64(503)},
|
|
|
|
|
expectedQuery: "WHERE (match(LOWER(body), LOWER(?)) AND ((((toFloat64(attributes_number['status.code']) = ? AND has(mapValues(attributes_number), ?)) AND mapContains(attributes_number, 'status.code')) OR ((toFloat64(attributes_number['status.code']) = ? AND has(mapValues(attributes_number), ?)) AND mapContains(attributes_number, 'status.code')))))",
|
|
|
|
|
expectedArgs: []any{"error", float64(500), float64(500), float64(503), float64(503)},
|
|
|
|
|
expectedErrorContains: "",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
category: "FREETEXT with parentheses",
|
|
|
|
|
query: "(status.code=500 OR status.code=503) AND error",
|
|
|
|
|
shouldPass: true,
|
|
|
|
|
expectedQuery: "WHERE ((((toFloat64(attributes_number['status.code']) = ? AND mapContains(attributes_number, 'status.code')) OR (toFloat64(attributes_number['status.code']) = ? AND mapContains(attributes_number, 'status.code')))) AND match(LOWER(body), LOWER(?)))",
|
|
|
|
|
expectedArgs: []any{float64(500), float64(503), "error"},
|
|
|
|
|
expectedQuery: "WHERE (((((toFloat64(attributes_number['status.code']) = ? AND has(mapValues(attributes_number), ?)) AND mapContains(attributes_number, 'status.code')) OR ((toFloat64(attributes_number['status.code']) = ? AND has(mapValues(attributes_number), ?)) AND mapContains(attributes_number, 'status.code')))) AND match(LOWER(body), LOWER(?)))",
|
|
|
|
|
expectedArgs: []any{float64(500), float64(500), float64(503), float64(503), "error"},
|
|
|
|
|
expectedErrorContains: "",
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
@@ -827,16 +827,16 @@ func TestFilterExprLogs(t *testing.T) {
|
|
|
|
|
category: "Basic equality",
|
|
|
|
|
query: "status=200",
|
|
|
|
|
shouldPass: true,
|
|
|
|
|
expectedQuery: "WHERE (toFloat64(attributes_number['status']) = ? AND mapContains(attributes_number, 'status'))",
|
|
|
|
|
expectedArgs: []any{float64(200)},
|
|
|
|
|
expectedQuery: "WHERE ((toFloat64(attributes_number['status']) = ? AND has(mapValues(attributes_number), ?)) AND mapContains(attributes_number, 'status'))",
|
|
|
|
|
expectedArgs: []any{float64(200), float64(200)},
|
|
|
|
|
expectedErrorContains: "",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
category: "Basic equality",
|
|
|
|
|
query: "code=400",
|
|
|
|
|
shouldPass: true,
|
|
|
|
|
expectedQuery: "WHERE (toFloat64(attributes_number['code']) = ? AND mapContains(attributes_number, 'code'))",
|
|
|
|
|
expectedArgs: []any{float64(400)},
|
|
|
|
|
expectedQuery: "WHERE ((toFloat64(attributes_number['code']) = ? AND has(mapValues(attributes_number), ?)) AND mapContains(attributes_number, 'code'))",
|
|
|
|
|
expectedArgs: []any{float64(400), float64(400)},
|
|
|
|
|
expectedErrorContains: "",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
@@ -867,8 +867,8 @@ func TestFilterExprLogs(t *testing.T) {
|
|
|
|
|
category: "Basic equality",
|
|
|
|
|
query: "count=0",
|
|
|
|
|
shouldPass: true,
|
|
|
|
|
expectedQuery: "WHERE (toFloat64(attributes_number['count']) = ? AND mapContains(attributes_number, 'count'))",
|
|
|
|
|
expectedArgs: []any{float64(0)},
|
|
|
|
|
expectedQuery: "WHERE ((toFloat64(attributes_number['count']) = ? AND has(mapValues(attributes_number), ?)) AND mapContains(attributes_number, 'count'))",
|
|
|
|
|
expectedArgs: []any{float64(0), float64(0)},
|
|
|
|
|
expectedErrorContains: "",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
@@ -1187,16 +1187,16 @@ func TestFilterExprLogs(t *testing.T) {
|
|
|
|
|
category: "IN operator (parentheses)",
|
|
|
|
|
query: "status IN (200, 201, 202)",
|
|
|
|
|
shouldPass: true,
|
|
|
|
|
expectedQuery: "WHERE ((toFloat64(attributes_number['status']) = ? OR toFloat64(attributes_number['status']) = ? OR toFloat64(attributes_number['status']) = ?) AND mapContains(attributes_number, 'status'))",
|
|
|
|
|
expectedArgs: []any{float64(200), float64(201), float64(202)},
|
|
|
|
|
expectedQuery: "WHERE (((toFloat64(attributes_number['status']) = ? AND has(mapValues(attributes_number), ?)) OR (toFloat64(attributes_number['status']) = ? AND has(mapValues(attributes_number), ?)) OR (toFloat64(attributes_number['status']) = ? AND has(mapValues(attributes_number), ?))) AND mapContains(attributes_number, 'status'))",
|
|
|
|
|
expectedArgs: []any{float64(200), float64(200), float64(201), float64(201), float64(202), float64(202)},
|
|
|
|
|
expectedErrorContains: "",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
category: "IN operator (parentheses)",
|
|
|
|
|
query: "error.code IN (404, 500, 503)",
|
|
|
|
|
shouldPass: true,
|
|
|
|
|
expectedQuery: "WHERE ((toFloat64(attributes_number['error.code']) = ? OR toFloat64(attributes_number['error.code']) = ? OR toFloat64(attributes_number['error.code']) = ?) AND mapContains(attributes_number, 'error.code'))",
|
|
|
|
|
expectedArgs: []any{float64(404), float64(500), float64(503)},
|
|
|
|
|
expectedQuery: "WHERE (((toFloat64(attributes_number['error.code']) = ? AND has(mapValues(attributes_number), ?)) OR (toFloat64(attributes_number['error.code']) = ? AND has(mapValues(attributes_number), ?)) OR (toFloat64(attributes_number['error.code']) = ? AND has(mapValues(attributes_number), ?))) AND mapContains(attributes_number, 'error.code'))",
|
|
|
|
|
expectedArgs: []any{float64(404), float64(404), float64(500), float64(500), float64(503), float64(503)},
|
|
|
|
|
expectedErrorContains: "",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
@@ -1221,16 +1221,16 @@ func TestFilterExprLogs(t *testing.T) {
|
|
|
|
|
category: "IN operator (brackets)",
|
|
|
|
|
query: "status IN [200, 201, 202]",
|
|
|
|
|
shouldPass: true,
|
|
|
|
|
expectedQuery: "WHERE ((toFloat64(attributes_number['status']) = ? OR toFloat64(attributes_number['status']) = ? OR toFloat64(attributes_number['status']) = ?) AND mapContains(attributes_number, 'status'))",
|
|
|
|
|
expectedArgs: []any{float64(200), float64(201), float64(202)},
|
|
|
|
|
expectedQuery: "WHERE (((toFloat64(attributes_number['status']) = ? AND has(mapValues(attributes_number), ?)) OR (toFloat64(attributes_number['status']) = ? AND has(mapValues(attributes_number), ?)) OR (toFloat64(attributes_number['status']) = ? AND has(mapValues(attributes_number), ?))) AND mapContains(attributes_number, 'status'))",
|
|
|
|
|
expectedArgs: []any{float64(200), float64(200), float64(201), float64(201), float64(202), float64(202)},
|
|
|
|
|
expectedErrorContains: "",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
category: "IN operator (brackets)",
|
|
|
|
|
query: "error.code IN [404, 500, 503]",
|
|
|
|
|
shouldPass: true,
|
|
|
|
|
expectedQuery: "WHERE ((toFloat64(attributes_number['error.code']) = ? OR toFloat64(attributes_number['error.code']) = ? OR toFloat64(attributes_number['error.code']) = ?) AND mapContains(attributes_number, 'error.code'))",
|
|
|
|
|
expectedArgs: []any{float64(404), float64(500), float64(503)},
|
|
|
|
|
expectedQuery: "WHERE (((toFloat64(attributes_number['error.code']) = ? AND has(mapValues(attributes_number), ?)) OR (toFloat64(attributes_number['error.code']) = ? AND has(mapValues(attributes_number), ?)) OR (toFloat64(attributes_number['error.code']) = ? AND has(mapValues(attributes_number), ?))) AND mapContains(attributes_number, 'error.code'))",
|
|
|
|
|
expectedArgs: []any{float64(404), float64(404), float64(500), float64(500), float64(503), float64(503)},
|
|
|
|
|
expectedErrorContains: "",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
@@ -1609,8 +1609,8 @@ func TestFilterExprLogs(t *testing.T) {
|
|
|
|
|
category: "Explicit AND",
|
|
|
|
|
query: "status=200 AND service.name=\"api\"",
|
|
|
|
|
shouldPass: true,
|
|
|
|
|
expectedQuery: "WHERE ((toFloat64(attributes_number['status']) = ? AND mapContains(attributes_number, 'status')) AND (multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) = ? AND multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) IS NOT NULL))",
|
|
|
|
|
expectedArgs: []any{float64(200), "api"},
|
|
|
|
|
expectedQuery: "WHERE (((toFloat64(attributes_number['status']) = ? AND has(mapValues(attributes_number), ?)) AND mapContains(attributes_number, 'status')) AND (multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) = ? AND multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) IS NOT NULL))",
|
|
|
|
|
expectedArgs: []any{float64(200), float64(200), "api"},
|
|
|
|
|
expectedErrorContains: "",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
@@ -1635,8 +1635,8 @@ func TestFilterExprLogs(t *testing.T) {
|
|
|
|
|
category: "Explicit OR",
|
|
|
|
|
query: "status=200 OR status=201",
|
|
|
|
|
shouldPass: true,
|
|
|
|
|
expectedQuery: "WHERE ((toFloat64(attributes_number['status']) = ? AND mapContains(attributes_number, 'status')) OR (toFloat64(attributes_number['status']) = ? AND mapContains(attributes_number, 'status')))",
|
|
|
|
|
expectedArgs: []any{float64(200), float64(201)},
|
|
|
|
|
expectedQuery: "WHERE (((toFloat64(attributes_number['status']) = ? AND has(mapValues(attributes_number), ?)) AND mapContains(attributes_number, 'status')) OR ((toFloat64(attributes_number['status']) = ? AND has(mapValues(attributes_number), ?)) AND mapContains(attributes_number, 'status')))",
|
|
|
|
|
expectedArgs: []any{float64(200), float64(200), float64(201), float64(201)},
|
|
|
|
|
expectedErrorContains: "",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
@@ -1661,8 +1661,8 @@ func TestFilterExprLogs(t *testing.T) {
|
|
|
|
|
category: "NOT with expressions",
|
|
|
|
|
query: "NOT status=200",
|
|
|
|
|
shouldPass: true,
|
|
|
|
|
expectedQuery: "WHERE NOT ((toFloat64(attributes_number['status']) = ? AND mapContains(attributes_number, 'status')))",
|
|
|
|
|
expectedArgs: []any{float64(200)},
|
|
|
|
|
expectedQuery: "WHERE NOT (((toFloat64(attributes_number['status']) = ? AND has(mapValues(attributes_number), ?)) AND mapContains(attributes_number, 'status')))",
|
|
|
|
|
expectedArgs: []any{float64(200), float64(200)},
|
|
|
|
|
expectedErrorContains: "",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
@@ -1687,8 +1687,8 @@ func TestFilterExprLogs(t *testing.T) {
|
|
|
|
|
category: "AND + OR combinations",
|
|
|
|
|
query: "status=200 AND (service.name=\"api\" OR service.name=\"web\")",
|
|
|
|
|
shouldPass: true,
|
|
|
|
|
expectedQuery: "WHERE ((toFloat64(attributes_number['status']) = ? AND mapContains(attributes_number, 'status')) AND (((multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) = ? AND multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) IS NOT NULL) OR (multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) = ? AND multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) IS NOT NULL))))",
|
|
|
|
|
expectedArgs: []any{float64(200), "api", "web"},
|
|
|
|
|
expectedQuery: "WHERE (((toFloat64(attributes_number['status']) = ? AND has(mapValues(attributes_number), ?)) AND mapContains(attributes_number, 'status')) AND (((multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) = ? AND multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) IS NOT NULL) OR (multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) = ? AND multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) IS NOT NULL))))",
|
|
|
|
|
expectedArgs: []any{float64(200), float64(200), "api", "web"},
|
|
|
|
|
expectedErrorContains: "",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
@@ -1713,8 +1713,8 @@ func TestFilterExprLogs(t *testing.T) {
|
|
|
|
|
category: "AND + NOT combinations",
|
|
|
|
|
query: "status=200 AND NOT service.name=\"api\"",
|
|
|
|
|
shouldPass: true,
|
|
|
|
|
expectedQuery: "WHERE ((toFloat64(attributes_number['status']) = ? AND mapContains(attributes_number, 'status')) AND NOT ((multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) = ? AND multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) IS NOT NULL)))",
|
|
|
|
|
expectedArgs: []any{float64(200), "api"},
|
|
|
|
|
expectedQuery: "WHERE (((toFloat64(attributes_number['status']) = ? AND has(mapValues(attributes_number), ?)) AND mapContains(attributes_number, 'status')) AND NOT ((multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) = ? AND multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) IS NOT NULL)))",
|
|
|
|
|
expectedArgs: []any{float64(200), float64(200), "api"},
|
|
|
|
|
expectedErrorContains: "",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
@@ -1731,8 +1731,8 @@ func TestFilterExprLogs(t *testing.T) {
|
|
|
|
|
category: "OR + NOT combinations",
|
|
|
|
|
query: "NOT status=200 OR NOT service.name=\"api\"",
|
|
|
|
|
shouldPass: true,
|
|
|
|
|
expectedQuery: "WHERE (NOT ((toFloat64(attributes_number['status']) = ? AND mapContains(attributes_number, 'status'))) OR NOT ((multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) = ? AND multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) IS NOT NULL)))",
|
|
|
|
|
expectedArgs: []any{float64(200), "api"},
|
|
|
|
|
expectedQuery: "WHERE (NOT (((toFloat64(attributes_number['status']) = ? AND has(mapValues(attributes_number), ?)) AND mapContains(attributes_number, 'status'))) OR NOT ((multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) = ? AND multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) IS NOT NULL)))",
|
|
|
|
|
expectedArgs: []any{float64(200), float64(200), "api"},
|
|
|
|
|
expectedErrorContains: "",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
@@ -1749,8 +1749,8 @@ func TestFilterExprLogs(t *testing.T) {
|
|
|
|
|
category: "AND + OR + NOT combinations",
|
|
|
|
|
query: "status=200 AND (service.name=\"api\" OR NOT duration>1000)",
|
|
|
|
|
shouldPass: true,
|
|
|
|
|
expectedQuery: "WHERE ((toFloat64(attributes_number['status']) = ? AND mapContains(attributes_number, 'status')) AND (((multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) = ? AND multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) IS NOT NULL) OR NOT ((toFloat64(attributes_number['duration']) > ? AND mapContains(attributes_number, 'duration'))))))",
|
|
|
|
|
expectedArgs: []any{float64(200), "api", float64(1000)},
|
|
|
|
|
expectedQuery: "WHERE (((toFloat64(attributes_number['status']) = ? AND has(mapValues(attributes_number), ?)) AND mapContains(attributes_number, 'status')) AND (((multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) = ? AND multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) IS NOT NULL) OR NOT ((toFloat64(attributes_number['duration']) > ? AND mapContains(attributes_number, 'duration'))))))",
|
|
|
|
|
expectedArgs: []any{float64(200), float64(200), "api", float64(1000)},
|
|
|
|
|
expectedErrorContains: "",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
@@ -1765,8 +1765,8 @@ func TestFilterExprLogs(t *testing.T) {
|
|
|
|
|
category: "AND + OR + NOT combinations",
|
|
|
|
|
query: "NOT (status=200 AND service.name=\"api\") OR count>0",
|
|
|
|
|
shouldPass: true,
|
|
|
|
|
expectedQuery: "WHERE (NOT ((((toFloat64(attributes_number['status']) = ? AND mapContains(attributes_number, 'status')) AND (multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) = ? AND multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) IS NOT NULL)))) OR (toFloat64(attributes_number['count']) > ? AND mapContains(attributes_number, 'count')))",
|
|
|
|
|
expectedArgs: []any{float64(200), "api", float64(0)},
|
|
|
|
|
expectedQuery: "WHERE (NOT (((((toFloat64(attributes_number['status']) = ? AND has(mapValues(attributes_number), ?)) AND mapContains(attributes_number, 'status')) AND (multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) = ? AND multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) IS NOT NULL)))) OR (toFloat64(attributes_number['count']) > ? AND mapContains(attributes_number, 'count')))",
|
|
|
|
|
expectedArgs: []any{float64(200), float64(200), "api", float64(0)},
|
|
|
|
|
expectedErrorContains: "",
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
@@ -1775,8 +1775,8 @@ func TestFilterExprLogs(t *testing.T) {
|
|
|
|
|
category: "Implicit AND",
|
|
|
|
|
query: "status=200 service.name=\"api\"",
|
|
|
|
|
shouldPass: true,
|
|
|
|
|
expectedQuery: "WHERE ((toFloat64(attributes_number['status']) = ? AND mapContains(attributes_number, 'status')) AND (multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) = ? AND multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) IS NOT NULL))",
|
|
|
|
|
expectedArgs: []any{float64(200), "api"},
|
|
|
|
|
expectedQuery: "WHERE (((toFloat64(attributes_number['status']) = ? AND has(mapValues(attributes_number), ?)) AND mapContains(attributes_number, 'status')) AND (multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) = ? AND multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) IS NOT NULL))",
|
|
|
|
|
expectedArgs: []any{float64(200), float64(200), "api"},
|
|
|
|
|
expectedErrorContains: "",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
@@ -1801,8 +1801,8 @@ func TestFilterExprLogs(t *testing.T) {
|
|
|
|
|
category: "Mixed implicit/explicit AND",
|
|
|
|
|
query: "status=200 AND service.name=\"api\" duration<1000",
|
|
|
|
|
shouldPass: true,
|
|
|
|
|
expectedQuery: "WHERE ((toFloat64(attributes_number['status']) = ? AND mapContains(attributes_number, 'status')) AND (multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) = ? AND multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) IS NOT NULL) AND (toFloat64(attributes_number['duration']) < ? AND mapContains(attributes_number, 'duration')))",
|
|
|
|
|
expectedArgs: []any{float64(200), "api", float64(1000)},
|
|
|
|
|
expectedQuery: "WHERE (((toFloat64(attributes_number['status']) = ? AND has(mapValues(attributes_number), ?)) AND mapContains(attributes_number, 'status')) AND (multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) = ? AND multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) IS NOT NULL) AND (toFloat64(attributes_number['duration']) < ? AND mapContains(attributes_number, 'duration')))",
|
|
|
|
|
expectedArgs: []any{float64(200), float64(200), "api", float64(1000)},
|
|
|
|
|
expectedErrorContains: "",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
@@ -1819,8 +1819,8 @@ func TestFilterExprLogs(t *testing.T) {
|
|
|
|
|
category: "Simple grouping",
|
|
|
|
|
query: "(status=200)",
|
|
|
|
|
shouldPass: true,
|
|
|
|
|
expectedQuery: "WHERE ((toFloat64(attributes_number['status']) = ? AND mapContains(attributes_number, 'status')))",
|
|
|
|
|
expectedArgs: []any{float64(200)},
|
|
|
|
|
expectedQuery: "WHERE (((toFloat64(attributes_number['status']) = ? AND has(mapValues(attributes_number), ?)) AND mapContains(attributes_number, 'status')))",
|
|
|
|
|
expectedArgs: []any{float64(200), float64(200)},
|
|
|
|
|
expectedErrorContains: "",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
@@ -1845,8 +1845,8 @@ func TestFilterExprLogs(t *testing.T) {
|
|
|
|
|
category: "Nested grouping",
|
|
|
|
|
query: "((status=200))",
|
|
|
|
|
shouldPass: true,
|
|
|
|
|
expectedQuery: "WHERE (((toFloat64(attributes_number['status']) = ? AND mapContains(attributes_number, 'status'))))",
|
|
|
|
|
expectedArgs: []any{float64(200)},
|
|
|
|
|
expectedQuery: "WHERE ((((toFloat64(attributes_number['status']) = ? AND has(mapValues(attributes_number), ?)) AND mapContains(attributes_number, 'status'))))",
|
|
|
|
|
expectedArgs: []any{float64(200), float64(200)},
|
|
|
|
|
expectedErrorContains: "",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
@@ -1871,8 +1871,8 @@ func TestFilterExprLogs(t *testing.T) {
|
|
|
|
|
category: "Complex nested grouping",
|
|
|
|
|
query: "(status=200 AND (service.name=\"api\" OR service.name=\"web\"))",
|
|
|
|
|
shouldPass: true,
|
|
|
|
|
expectedQuery: "WHERE (((toFloat64(attributes_number['status']) = ? AND mapContains(attributes_number, 'status')) AND (((multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) = ? AND multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) IS NOT NULL) OR (multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) = ? AND multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) IS NOT NULL)))))",
|
|
|
|
|
expectedArgs: []any{float64(200), "api", "web"},
|
|
|
|
|
expectedQuery: "WHERE ((((toFloat64(attributes_number['status']) = ? AND has(mapValues(attributes_number), ?)) AND mapContains(attributes_number, 'status')) AND (((multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) = ? AND multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) IS NOT NULL) OR (multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) = ? AND multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) IS NOT NULL)))))",
|
|
|
|
|
expectedArgs: []any{float64(200), float64(200), "api", "web"},
|
|
|
|
|
expectedErrorContains: "",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
@@ -1897,8 +1897,8 @@ func TestFilterExprLogs(t *testing.T) {
|
|
|
|
|
category: "Deep nesting",
|
|
|
|
|
query: "(((status=200 OR status=201) AND service.name=\"api\") OR ((status=202 OR status=203) AND service.name=\"web\"))",
|
|
|
|
|
shouldPass: true,
|
|
|
|
|
expectedQuery: "WHERE (((((((toFloat64(attributes_number['status']) = ? AND mapContains(attributes_number, 'status')) OR (toFloat64(attributes_number['status']) = ? AND mapContains(attributes_number, 'status')))) AND (multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) = ? AND multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) IS NOT NULL))) OR (((((toFloat64(attributes_number['status']) = ? AND mapContains(attributes_number, 'status')) OR (toFloat64(attributes_number['status']) = ? AND mapContains(attributes_number, 'status')))) AND (multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) = ? AND multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) IS NOT NULL)))))",
|
|
|
|
|
expectedArgs: []any{float64(200), float64(201), "api", float64(202), float64(203), "web"},
|
|
|
|
|
expectedQuery: "WHERE ((((((((toFloat64(attributes_number['status']) = ? AND has(mapValues(attributes_number), ?)) AND mapContains(attributes_number, 'status')) OR ((toFloat64(attributes_number['status']) = ? AND has(mapValues(attributes_number), ?)) AND mapContains(attributes_number, 'status')))) AND (multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) = ? AND multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) IS NOT NULL))) OR ((((((toFloat64(attributes_number['status']) = ? AND has(mapValues(attributes_number), ?)) AND mapContains(attributes_number, 'status')) OR ((toFloat64(attributes_number['status']) = ? AND has(mapValues(attributes_number), ?)) AND mapContains(attributes_number, 'status')))) AND (multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) = ? AND multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) IS NOT NULL)))))",
|
|
|
|
|
expectedArgs: []any{float64(200), float64(200), float64(201), float64(201), "api", float64(202), float64(202), float64(203), float64(203), "web"},
|
|
|
|
|
expectedErrorContains: "",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
@@ -1949,32 +1949,32 @@ func TestFilterExprLogs(t *testing.T) {
|
|
|
|
|
category: "Numeric values",
|
|
|
|
|
query: "status=200",
|
|
|
|
|
shouldPass: true,
|
|
|
|
|
expectedQuery: "WHERE (toFloat64(attributes_number['status']) = ? AND mapContains(attributes_number, 'status'))",
|
|
|
|
|
expectedArgs: []any{float64(200)},
|
|
|
|
|
expectedQuery: "WHERE ((toFloat64(attributes_number['status']) = ? AND has(mapValues(attributes_number), ?)) AND mapContains(attributes_number, 'status'))",
|
|
|
|
|
expectedArgs: []any{float64(200), float64(200)},
|
|
|
|
|
expectedErrorContains: "",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
category: "Numeric values",
|
|
|
|
|
query: "count=0",
|
|
|
|
|
shouldPass: true,
|
|
|
|
|
expectedQuery: "WHERE (toFloat64(attributes_number['count']) = ? AND mapContains(attributes_number, 'count'))",
|
|
|
|
|
expectedArgs: []any{float64(0)},
|
|
|
|
|
expectedQuery: "WHERE ((toFloat64(attributes_number['count']) = ? AND has(mapValues(attributes_number), ?)) AND mapContains(attributes_number, 'count'))",
|
|
|
|
|
expectedArgs: []any{float64(0), float64(0)},
|
|
|
|
|
expectedErrorContains: "",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
category: "Numeric values",
|
|
|
|
|
query: "duration=1000.5",
|
|
|
|
|
shouldPass: true,
|
|
|
|
|
expectedQuery: "WHERE (toFloat64(attributes_number['duration']) = ? AND mapContains(attributes_number, 'duration'))",
|
|
|
|
|
expectedArgs: []any{float64(1000.5)},
|
|
|
|
|
expectedQuery: "WHERE ((toFloat64(attributes_number['duration']) = ? AND has(mapValues(attributes_number), ?)) AND mapContains(attributes_number, 'duration'))",
|
|
|
|
|
expectedArgs: []any{float64(1000.5), float64(1000.5)},
|
|
|
|
|
expectedErrorContains: "",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
category: "Numeric values",
|
|
|
|
|
query: "amount=-10.25",
|
|
|
|
|
shouldPass: true,
|
|
|
|
|
expectedQuery: "WHERE (toFloat64(attributes_number['amount']) = ? AND mapContains(attributes_number, 'amount'))",
|
|
|
|
|
expectedArgs: []any{float64(-10.25)},
|
|
|
|
|
expectedQuery: "WHERE ((toFloat64(attributes_number['amount']) = ? AND has(mapValues(attributes_number), ?)) AND mapContains(attributes_number, 'amount'))",
|
|
|
|
|
expectedArgs: []any{float64(-10.25), float64(-10.25)},
|
|
|
|
|
expectedErrorContains: "",
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
@@ -2052,8 +2052,8 @@ func TestFilterExprLogs(t *testing.T) {
|
|
|
|
|
category: "Nested object paths",
|
|
|
|
|
query: "response.body.data.items[].id=123",
|
|
|
|
|
shouldPass: true,
|
|
|
|
|
expectedQuery: `WHERE ((toFloat64(attributes_number['response.body.data.items[].id']) = ? AND mapContains(attributes_number, 'response.body.data.items[].id')) OR (JSONExtract(JSON_VALUE(body, '$."response"."body"."data"."items"[*]."id"'), 'Float64') = ? AND JSON_EXISTS(body, '$."response"."body"."data"."items"[*]."id"')))`,
|
|
|
|
|
expectedArgs: []any{float64(123), float64(123)},
|
|
|
|
|
expectedQuery: `WHERE (((toFloat64(attributes_number['response.body.data.items[].id']) = ? AND has(mapValues(attributes_number), ?)) AND mapContains(attributes_number, 'response.body.data.items[].id')) OR (JSONExtract(JSON_VALUE(body, '$."response"."body"."data"."items"[*]."id"'), 'Float64') = ? AND JSON_EXISTS(body, '$."response"."body"."data"."items"[*]."id"')))`,
|
|
|
|
|
expectedArgs: []any{float64(123), float64(123), float64(123)},
|
|
|
|
|
expectedErrorContains: "",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
@@ -2083,29 +2083,29 @@ func TestFilterExprLogs(t *testing.T) {
|
|
|
|
|
category: "Operator precedence",
|
|
|
|
|
query: "NOT status=200 AND service.name=\"api\"",
|
|
|
|
|
shouldPass: true,
|
|
|
|
|
expectedQuery: "WHERE (NOT ((toFloat64(attributes_number['status']) = ? AND mapContains(attributes_number, 'status'))) AND (multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) = ? AND multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) IS NOT NULL))",
|
|
|
|
|
expectedArgs: []any{float64(200), "api"}, // Should be (NOT status=200) AND service.name="api"
|
|
|
|
|
expectedQuery: "WHERE (NOT (((toFloat64(attributes_number['status']) = ? AND has(mapValues(attributes_number), ?)) AND mapContains(attributes_number, 'status'))) AND (multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) = ? AND multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) IS NOT NULL))",
|
|
|
|
|
expectedArgs: []any{float64(200), float64(200), "api"}, // Should be (NOT status=200) AND service.name="api"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
category: "Operator precedence",
|
|
|
|
|
query: "status=200 AND service.name=\"api\" OR service.name=\"web\"",
|
|
|
|
|
shouldPass: true,
|
|
|
|
|
expectedQuery: "WHERE (((toFloat64(attributes_number['status']) = ? AND mapContains(attributes_number, 'status')) AND (multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) = ? AND multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) IS NOT NULL)) OR (multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) = ? AND multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) IS NOT NULL))",
|
|
|
|
|
expectedArgs: []any{float64(200), "api", "web"}, // Should be (status=200 AND service.name="api") OR service.name="web"
|
|
|
|
|
expectedQuery: "WHERE ((((toFloat64(attributes_number['status']) = ? AND has(mapValues(attributes_number), ?)) AND mapContains(attributes_number, 'status')) AND (multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) = ? AND multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) IS NOT NULL)) OR (multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) = ? AND multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) IS NOT NULL))",
|
|
|
|
|
expectedArgs: []any{float64(200), float64(200), "api", "web"}, // Should be (status=200 AND service.name="api") OR service.name="web"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
category: "Operator precedence",
|
|
|
|
|
query: "NOT status=200 OR NOT service.name=\"api\"",
|
|
|
|
|
shouldPass: true,
|
|
|
|
|
expectedQuery: "WHERE (NOT ((toFloat64(attributes_number['status']) = ? AND mapContains(attributes_number, 'status'))) OR NOT ((multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) = ? AND multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) IS NOT NULL)))",
|
|
|
|
|
expectedArgs: []any{float64(200), "api"}, // Should be (NOT status=200) OR (NOT service.name="api")
|
|
|
|
|
expectedQuery: "WHERE (NOT (((toFloat64(attributes_number['status']) = ? AND has(mapValues(attributes_number), ?)) AND mapContains(attributes_number, 'status'))) OR NOT ((multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) = ? AND multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) IS NOT NULL)))",
|
|
|
|
|
expectedArgs: []any{float64(200), float64(200), "api"}, // Should be (NOT status=200) OR (NOT service.name="api")
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
category: "Operator precedence",
|
|
|
|
|
query: "status=200 OR service.name=\"api\" AND level=\"ERROR\"",
|
|
|
|
|
shouldPass: true,
|
|
|
|
|
expectedQuery: "WHERE ((toFloat64(attributes_number['status']) = ? AND mapContains(attributes_number, 'status')) OR ((multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) = ? AND multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) IS NOT NULL) AND (attributes_string['level'] = ? AND mapContains(attributes_string, 'level'))))",
|
|
|
|
|
expectedArgs: []any{float64(200), "api", "ERROR"}, // Should be status=200 OR (service.name="api" AND level="ERROR")
|
|
|
|
|
expectedQuery: "WHERE (((toFloat64(attributes_number['status']) = ? AND has(mapValues(attributes_number), ?)) AND mapContains(attributes_number, 'status')) OR ((multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) = ? AND multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) IS NOT NULL) AND (attributes_string['level'] = ? AND mapContains(attributes_string, 'level'))))",
|
|
|
|
|
expectedArgs: []any{float64(200), float64(200), "api", "ERROR"}, // Should be status=200 OR (service.name="api" AND level="ERROR")
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
// Different whitespace patterns
|
|
|
|
|
@@ -2129,8 +2129,8 @@ func TestFilterExprLogs(t *testing.T) {
|
|
|
|
|
category: "Whitespace patterns",
|
|
|
|
|
query: "status=200 AND service.name=\"api\"",
|
|
|
|
|
shouldPass: true,
|
|
|
|
|
expectedQuery: "WHERE ((toFloat64(attributes_number['status']) = ? AND mapContains(attributes_number, 'status')) AND (multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) = ? AND multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) IS NOT NULL))",
|
|
|
|
|
expectedArgs: []any{float64(200), "api"}, // Multiple spaces
|
|
|
|
|
expectedQuery: "WHERE (((toFloat64(attributes_number['status']) = ? AND has(mapValues(attributes_number), ?)) AND mapContains(attributes_number, 'status')) AND (multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) = ? AND multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) IS NOT NULL))",
|
|
|
|
|
expectedArgs: []any{float64(200), float64(200), "api"}, // Multiple spaces
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
// More Unicode characters
|
|
|
|
|
@@ -2365,8 +2365,8 @@ func TestFilterExprLogs(t *testing.T) {
|
|
|
|
|
category: "Unusual whitespace",
|
|
|
|
|
query: "status = 200 AND service.name = \"api\"",
|
|
|
|
|
shouldPass: true,
|
|
|
|
|
expectedQuery: "WHERE ((toFloat64(attributes_number['status']) = ? AND mapContains(attributes_number, 'status')) AND (multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) = ? AND multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) IS NOT NULL))",
|
|
|
|
|
expectedArgs: []any{float64(200), "api"},
|
|
|
|
|
expectedQuery: "WHERE (((toFloat64(attributes_number['status']) = ? AND has(mapValues(attributes_number), ?)) AND mapContains(attributes_number, 'status')) AND (multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) = ? AND multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) IS NOT NULL))",
|
|
|
|
|
expectedArgs: []any{float64(200), float64(200), "api"},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
category: "Unusual whitespace",
|
|
|
|
|
@@ -2426,9 +2426,9 @@ func TestFilterExprLogs(t *testing.T) {
|
|
|
|
|
)
|
|
|
|
|
`,
|
|
|
|
|
shouldPass: true,
|
|
|
|
|
expectedQuery: "WHERE ((((((((toFloat64(attributes_number['status']) >= ? AND mapContains(attributes_number, 'status')) AND (toFloat64(attributes_number['status']) < ? AND mapContains(attributes_number, 'status')))) OR (((toFloat64(attributes_number['status']) >= ? AND mapContains(attributes_number, 'status')) AND (toFloat64(attributes_number['status']) < ? AND mapContains(attributes_number, 'status')) AND NOT ((toFloat64(attributes_number['status']) = ? AND mapContains(attributes_number, 'status'))))))) AND ((((multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) = ? OR multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) = ? OR multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) = ?) AND multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) IS NOT NULL) OR (((multiIf(resource.`service.type` IS NOT NULL, resource.`service.type`::String, mapContains(resources_string, 'service.type'), resources_string['service.type'], NULL) = ? AND multiIf(resource.`service.type` IS NOT NULL, resource.`service.type`::String, mapContains(resources_string, 'service.type'), resources_string['service.type'], NULL) IS NOT NULL) AND NOT ((multiIf(resource.`service.deprecated` IS NOT NULL, resource.`service.deprecated`::String, mapContains(resources_string, 'service.deprecated'), resources_string['service.deprecated'], NULL) = ? AND multiIf(resource.`service.deprecated` IS NOT NULL, resource.`service.deprecated`::String, mapContains(resources_string, 'service.deprecated'), resources_string['service.deprecated'], NULL) IS NOT NULL)))))))) AND (((((toFloat64(attributes_number['duration']) < ? AND mapContains(attributes_number, 'duration')) OR ((toFloat64(attributes_number['duration']) BETWEEN ? AND ? AND mapContains(attributes_number, 'duration'))))) AND ((multiIf(resource.`environment` IS NOT NULL, resource.`environment`::String, mapContains(resources_string, 'environment'), resources_string['environment'], NULL) <> ? OR (((multiIf(resource.`environment` IS NOT NULL, resource.`environment`::String, mapContains(resources_string, 'environment'), resources_string['environment'], NULL) = ? AND multiIf(resource.`environment` IS NOT NULL, resource.`environment`::String, mapContains(resources_string, 'environment'), resources_string['environment'], NULL) IS NOT NULL) AND (attributes_bool['is_automated_test'] = ? AND mapContains(attributes_bool, 'is_automated_test')))))))) AND NOT ((((((LOWER(attributes_string['message']) LIKE LOWER(?) AND mapContains(attributes_string, 'message')) OR (LOWER(attributes_string['message']) LIKE LOWER(?) AND mapContains(attributes_string, 'message')))) AND (attributes_string['severity'] = ? AND mapContains(attributes_string, 'severity'))))))",
|
|
|
|
|
expectedQuery: "WHERE ((((((((toFloat64(attributes_number['status']) >= ? AND mapContains(attributes_number, 'status')) AND (toFloat64(attributes_number['status']) < ? AND mapContains(attributes_number, 'status')))) OR (((toFloat64(attributes_number['status']) >= ? AND mapContains(attributes_number, 'status')) AND (toFloat64(attributes_number['status']) < ? AND mapContains(attributes_number, 'status')) AND NOT (((toFloat64(attributes_number['status']) = ? AND has(mapValues(attributes_number), ?)) AND mapContains(attributes_number, 'status'))))))) AND ((((multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) = ? OR multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) = ? OR multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) = ?) AND multiIf(resource.`service.name` IS NOT NULL, resource.`service.name`::String, mapContains(resources_string, 'service.name'), resources_string['service.name'], NULL) IS NOT NULL) OR (((multiIf(resource.`service.type` IS NOT NULL, resource.`service.type`::String, mapContains(resources_string, 'service.type'), resources_string['service.type'], NULL) = ? AND multiIf(resource.`service.type` IS NOT NULL, resource.`service.type`::String, mapContains(resources_string, 'service.type'), resources_string['service.type'], NULL) IS NOT NULL) AND NOT ((multiIf(resource.`service.deprecated` IS NOT NULL, resource.`service.deprecated`::String, mapContains(resources_string, 'service.deprecated'), resources_string['service.deprecated'], NULL) = ? AND multiIf(resource.`service.deprecated` IS NOT NULL, resource.`service.deprecated`::String, mapContains(resources_string, 'service.deprecated'), resources_string['service.deprecated'], NULL) IS NOT NULL)))))))) AND (((((toFloat64(attributes_number['duration']) < ? AND mapContains(attributes_number, 'duration')) OR ((toFloat64(attributes_number['duration']) BETWEEN ? AND ? AND mapContains(attributes_number, 'duration'))))) AND ((multiIf(resource.`environment` IS NOT NULL, resource.`environment`::String, mapContains(resources_string, 'environment'), resources_string['environment'], NULL) <> ? OR (((multiIf(resource.`environment` IS NOT NULL, resource.`environment`::String, mapContains(resources_string, 'environment'), resources_string['environment'], NULL) = ? AND multiIf(resource.`environment` IS NOT NULL, resource.`environment`::String, mapContains(resources_string, 'environment'), resources_string['environment'], NULL) IS NOT NULL) AND (attributes_bool['is_automated_test'] = ? AND mapContains(attributes_bool, 'is_automated_test')))))))) AND NOT ((((((LOWER(attributes_string['message']) LIKE LOWER(?) AND mapContains(attributes_string, 'message')) OR (LOWER(attributes_string['message']) LIKE LOWER(?) AND mapContains(attributes_string, 'message')))) AND (attributes_string['severity'] = ? AND mapContains(attributes_string, 'severity'))))))",
|
|
|
|
|
expectedArgs: []any{
|
|
|
|
|
float64(200), float64(300), float64(400), float64(500), float64(404),
|
|
|
|
|
float64(200), float64(300), float64(400), float64(500), float64(404), float64(404),
|
|
|
|
|
"api", "web", "auth",
|
|
|
|
|
"internal", true,
|
|
|
|
|
float64(1000), float64(1000), float64(5000),
|
|
|
|
|
|