From 8586788517065a504c4bb0e62de92dafb74ddf7e Mon Sep 17 00:00:00 2001 From: Liu Chao Date: Wed, 9 Oct 2024 11:48:18 +0800 Subject: [PATCH] feat: exist function supports non-resource tags --- server/querier/engine/clickhouse/clickhouse_test.go | 3 +++ server/querier/engine/clickhouse/filter.go | 8 ++++++++ 2 files changed, 11 insertions(+) diff --git a/server/querier/engine/clickhouse/clickhouse_test.go b/server/querier/engine/clickhouse/clickhouse_test.go index e7e9d9c030f..fe01eff80f2 100644 --- a/server/querier/engine/clickhouse/clickhouse_test.go +++ b/server/querier/engine/clickhouse/clickhouse_test.go @@ -279,6 +279,9 @@ var ( }, { input: "SELECT chost_id_0 from l4_flow_log WHERE NOT exist(chost_0) LIMIT 1", output: "SELECT if(l3_device_type_0=1,l3_device_id_0, 0) AS `chost_id_0` FROM flow_log.`l4_flow_log` PREWHERE NOT (l3_device_type_0=1) LIMIT 1", + }, { + input: "SELECT response_code from l4_flow_log WHERE exist(response_code) LIMIT 1", + output: "SELECT response_code FROM flow_log.`l4_flow_log` PREWHERE ((isNotNull(response_code))) LIMIT 1", }, { input: "SELECT `cloud.tag.xx_0` from l4_flow_log WHERE NOT exist(`cloud.tag.xx_0`) LIMIT 1", output: "SELECT if(if(l3_device_type_0=1, dictGet(flow_tag.chost_cloud_tag_map, 'value', (toUInt64(l3_device_id_0),'xx')), '')!='',if(l3_device_type_0=1, dictGet(flow_tag.chost_cloud_tag_map, 'value', (toUInt64(l3_device_id_0),'xx')), ''), dictGet(flow_tag.pod_ns_cloud_tag_map, 'value', (toUInt64(pod_ns_id_0),'xx')) ) AS `cloud.tag.xx_0` FROM flow_log.`l4_flow_log` PREWHERE NOT (((toUInt64(l3_device_id_0) IN (SELECT id FROM flow_tag.chost_cloud_tag_map WHERE key='xx') AND l3_device_type_0=1) OR (toUInt64(pod_ns_id_0) IN (SELECT id FROM flow_tag.pod_ns_cloud_tag_map WHERE key='xx')))) LIMIT 1", diff --git a/server/querier/engine/clickhouse/filter.go b/server/querier/engine/clickhouse/filter.go index c4455a73d5a..c404c49c0fb 100644 --- a/server/querier/engine/clickhouse/filter.go +++ b/server/querier/engine/clickhouse/filter.go @@ -156,6 +156,14 @@ func TransWhereTagFunction(db, table string, name string, args []string) (filter } else { filter = resourceInfo.ResourceName + "_id" + suffix + "!=0" } + } else { + // non-resource tags + engine := &CHEngine{DB: db, Table: table} + notNullExpr, ok := GetNotNullFilter(resource, engine) + if !ok { + return + } + filter = notNullExpr.(*view.Expr).Value } } return