diff --git a/migrations/033_fct_block_first_seen_by_node_daily.down.sql b/migrations/033_fct_block_first_seen_by_node_daily.down.sql new file mode 100644 index 00000000..c4958dd8 --- /dev/null +++ b/migrations/033_fct_block_first_seen_by_node_daily.down.sql @@ -0,0 +1,2 @@ +DROP TABLE IF EXISTS `${NETWORK_NAME}`.fct_block_first_seen_by_node_daily ON CLUSTER '{cluster}'; +DROP TABLE IF EXISTS `${NETWORK_NAME}`.fct_block_first_seen_by_node_daily_local ON CLUSTER '{cluster}'; diff --git a/migrations/033_fct_block_first_seen_by_node_daily.up.sql b/migrations/033_fct_block_first_seen_by_node_daily.up.sql new file mode 100644 index 00000000..6ff58460 --- /dev/null +++ b/migrations/033_fct_block_first_seen_by_node_daily.up.sql @@ -0,0 +1,55 @@ +CREATE TABLE `${NETWORK_NAME}`.fct_block_first_seen_by_node_daily_local on cluster '{cluster}' ( + `updated_date_time` DateTime COMMENT 'Timestamp when the record was last updated' CODEC(DoubleDelta, ZSTD(1)), + `day` Date COMMENT 'Calendar day (UTC)' CODEC(DoubleDelta, ZSTD(1)), + `day_start_date_time` DateTime COMMENT 'Start of day at midnight UTC' CODEC(DoubleDelta, ZSTD(1)), + `username` LowCardinality(String) COMMENT 'Username of the node' CODEC(ZSTD(1)), + `node_id` String COMMENT 'ID of the node' CODEC(ZSTD(1)), + `classification` LowCardinality(String) COMMENT 'Classification of the node, e.g. "individual", "corporate", "internal" (aka ethPandaOps) or "unclassified"' CODEC(ZSTD(1)), + `meta_client_name` LowCardinality(String) COMMENT 'Name of the client', + `meta_client_implementation` LowCardinality(String) COMMENT 'Implementation of the client', + `meta_client_geo_city` LowCardinality(String) COMMENT 'City of the client' CODEC(ZSTD(1)), + `meta_client_geo_country` LowCardinality(String) COMMENT 'Country of the client' CODEC(ZSTD(1)), + `meta_client_geo_country_code` LowCardinality(String) COMMENT 'Country code of the client' CODEC(ZSTD(1)), + `meta_client_geo_continent_code` LowCardinality(String) COMMENT 'Continent code of the client' CODEC(ZSTD(1)), + `meta_client_geo_longitude` Nullable(Float64) COMMENT 'Longitude of the client' CODEC(ZSTD(1)), + `meta_client_geo_latitude` Nullable(Float64) COMMENT 'Latitude of the client' CODEC(ZSTD(1)), + `meta_client_geo_autonomous_system_number` Nullable(UInt32) COMMENT 'Autonomous system number of the client' CODEC(ZSTD(1)), + `meta_client_geo_autonomous_system_organization` Nullable(String) COMMENT 'Autonomous system organization of the client' CODEC(ZSTD(1)), + `min_slot` UInt64 COMMENT 'Minimum slot number in this day' CODEC(ZSTD(1)), + `max_slot` UInt64 COMMENT 'Maximum slot number in this day' CODEC(ZSTD(1)), + `epoch_count` UInt32 COMMENT 'Number of epochs in this day' CODEC(ZSTD(1)), + `slot_count` UInt32 COMMENT 'Number of slots with blocks seen in this day' CODEC(ZSTD(1)), + `min_seen_slot_start_diff_ms` UInt32 COMMENT 'Minimum time from slot start for the node to see a block (milliseconds)' CODEC(ZSTD(1)), + `p05_seen_slot_start_diff_ms` UInt32 COMMENT '5th percentile time from slot start (milliseconds)' CODEC(ZSTD(1)), + `p50_seen_slot_start_diff_ms` UInt32 COMMENT 'Median (p50) time from slot start (milliseconds)' CODEC(ZSTD(1)), + `avg_seen_slot_start_diff_ms` UInt32 COMMENT 'Average time from slot start (milliseconds)' CODEC(ZSTD(1)), + `p90_seen_slot_start_diff_ms` UInt32 COMMENT '90th percentile time from slot start (milliseconds)' CODEC(ZSTD(1)), + `p95_seen_slot_start_diff_ms` UInt32 COMMENT '95th percentile time from slot start (milliseconds)' CODEC(ZSTD(1)), + `p99_seen_slot_start_diff_ms` UInt32 COMMENT '99th percentile time from slot start (milliseconds)' CODEC(ZSTD(1)), + `max_seen_slot_start_diff_ms` UInt32 COMMENT 'Maximum time from slot start (milliseconds)' CODEC(ZSTD(1)) +) ENGINE = ReplicatedReplacingMergeTree( + '/clickhouse/{installation}/{cluster}/tables/{shard}/{database}/{table}', + '{replica}', + `updated_date_time` +) PARTITION BY toYYYYMM(day) +ORDER BY + (`day`, `username`, `node_id`, `classification`, `meta_client_name`) +SETTINGS + deduplicate_merge_projection_mode = 'rebuild', + min_age_to_force_merge_seconds = 384, + min_age_to_force_merge_on_partition_only=false +COMMENT 'Block first seen statistics by node aggregated by day'; + +CREATE TABLE `${NETWORK_NAME}`.fct_block_first_seen_by_node_daily ON CLUSTER '{cluster}' AS `${NETWORK_NAME}`.fct_block_first_seen_by_node_daily_local ENGINE = Distributed( + '{cluster}', + '${NETWORK_NAME}', + fct_block_first_seen_by_node_daily_local, + cityHash64(`day`, `username`, `node_id`, `classification`, `meta_client_name`) +); + +ALTER TABLE `${NETWORK_NAME}`.fct_block_first_seen_by_node_daily_local ON CLUSTER '{cluster}' +ADD PROJECTION p_by_day_node +( + SELECT * + ORDER BY (`day`, `username`, `node_id`, `classification`, `meta_client_name`) +); diff --git a/migrations/034_fct_block_first_seen_by_node_weekly.down.sql b/migrations/034_fct_block_first_seen_by_node_weekly.down.sql new file mode 100644 index 00000000..bb3475c9 --- /dev/null +++ b/migrations/034_fct_block_first_seen_by_node_weekly.down.sql @@ -0,0 +1,2 @@ +DROP TABLE IF EXISTS `${NETWORK_NAME}`.fct_block_first_seen_by_node_weekly ON CLUSTER '{cluster}'; +DROP TABLE IF EXISTS `${NETWORK_NAME}`.fct_block_first_seen_by_node_weekly_local ON CLUSTER '{cluster}'; diff --git a/migrations/034_fct_block_first_seen_by_node_weekly.up.sql b/migrations/034_fct_block_first_seen_by_node_weekly.up.sql new file mode 100644 index 00000000..63227fe1 --- /dev/null +++ b/migrations/034_fct_block_first_seen_by_node_weekly.up.sql @@ -0,0 +1,56 @@ +CREATE TABLE `${NETWORK_NAME}`.fct_block_first_seen_by_node_weekly_local on cluster '{cluster}' ( + `updated_date_time` DateTime COMMENT 'Timestamp when the record was last updated' CODEC(DoubleDelta, ZSTD(1)), + `week` Date COMMENT 'Start of week (Monday)' CODEC(DoubleDelta, ZSTD(1)), + `week_start_date_time` DateTime COMMENT 'Start of week at midnight UTC (Monday)' CODEC(DoubleDelta, ZSTD(1)), + `username` LowCardinality(String) COMMENT 'Username of the node' CODEC(ZSTD(1)), + `node_id` String COMMENT 'ID of the node' CODEC(ZSTD(1)), + `classification` LowCardinality(String) COMMENT 'Classification of the node, e.g. "individual", "corporate", "internal" (aka ethPandaOps) or "unclassified"' CODEC(ZSTD(1)), + `meta_client_name` LowCardinality(String) COMMENT 'Name of the client', + `meta_client_implementation` LowCardinality(String) COMMENT 'Implementation of the client', + `meta_client_geo_city` LowCardinality(String) COMMENT 'City of the client' CODEC(ZSTD(1)), + `meta_client_geo_country` LowCardinality(String) COMMENT 'Country of the client' CODEC(ZSTD(1)), + `meta_client_geo_country_code` LowCardinality(String) COMMENT 'Country code of the client' CODEC(ZSTD(1)), + `meta_client_geo_continent_code` LowCardinality(String) COMMENT 'Continent code of the client' CODEC(ZSTD(1)), + `meta_client_geo_longitude` Nullable(Float64) COMMENT 'Longitude of the client' CODEC(ZSTD(1)), + `meta_client_geo_latitude` Nullable(Float64) COMMENT 'Latitude of the client' CODEC(ZSTD(1)), + `meta_client_geo_autonomous_system_number` Nullable(UInt32) COMMENT 'Autonomous system number of the client' CODEC(ZSTD(1)), + `meta_client_geo_autonomous_system_organization` Nullable(String) COMMENT 'Autonomous system organization of the client' CODEC(ZSTD(1)), + `min_slot` UInt64 COMMENT 'Minimum slot number in this week' CODEC(ZSTD(1)), + `max_slot` UInt64 COMMENT 'Maximum slot number in this week' CODEC(ZSTD(1)), + `day_count` UInt32 COMMENT 'Number of days in this week' CODEC(ZSTD(1)), + `epoch_count` UInt32 COMMENT 'Number of epochs in this week' CODEC(ZSTD(1)), + `slot_count` UInt32 COMMENT 'Number of slots with blocks seen in this week' CODEC(ZSTD(1)), + `min_seen_slot_start_diff_ms` UInt32 COMMENT 'Minimum time from slot start for the node to see a block (milliseconds)' CODEC(ZSTD(1)), + `p05_seen_slot_start_diff_ms` UInt32 COMMENT '5th percentile time from slot start (milliseconds)' CODEC(ZSTD(1)), + `p50_seen_slot_start_diff_ms` UInt32 COMMENT 'Median (p50) time from slot start (milliseconds)' CODEC(ZSTD(1)), + `avg_seen_slot_start_diff_ms` UInt32 COMMENT 'Average time from slot start (milliseconds)' CODEC(ZSTD(1)), + `p90_seen_slot_start_diff_ms` UInt32 COMMENT '90th percentile time from slot start (milliseconds)' CODEC(ZSTD(1)), + `p95_seen_slot_start_diff_ms` UInt32 COMMENT '95th percentile time from slot start (milliseconds)' CODEC(ZSTD(1)), + `p99_seen_slot_start_diff_ms` UInt32 COMMENT '99th percentile time from slot start (milliseconds)' CODEC(ZSTD(1)), + `max_seen_slot_start_diff_ms` UInt32 COMMENT 'Maximum time from slot start (milliseconds)' CODEC(ZSTD(1)) +) ENGINE = ReplicatedReplacingMergeTree( + '/clickhouse/{installation}/{cluster}/tables/{shard}/{database}/{table}', + '{replica}', + `updated_date_time` +) PARTITION BY toYYYYMM(week) +ORDER BY + (`week`, `username`, `node_id`, `classification`, `meta_client_name`) +SETTINGS + deduplicate_merge_projection_mode = 'rebuild', + min_age_to_force_merge_seconds = 384, + min_age_to_force_merge_on_partition_only=false +COMMENT 'Block first seen statistics by node aggregated by week'; + +CREATE TABLE `${NETWORK_NAME}`.fct_block_first_seen_by_node_weekly ON CLUSTER '{cluster}' AS `${NETWORK_NAME}`.fct_block_first_seen_by_node_weekly_local ENGINE = Distributed( + '{cluster}', + '${NETWORK_NAME}', + fct_block_first_seen_by_node_weekly_local, + cityHash64(`week`, `username`, `node_id`, `classification`, `meta_client_name`) +); + +ALTER TABLE `${NETWORK_NAME}`.fct_block_first_seen_by_node_weekly_local ON CLUSTER '{cluster}' +ADD PROJECTION p_by_week_node +( + SELECT * + ORDER BY (`week`, `username`, `node_id`, `classification`, `meta_client_name`) +); diff --git a/migrations/035_fct_block_first_seen_by_node_monthly.down.sql b/migrations/035_fct_block_first_seen_by_node_monthly.down.sql new file mode 100644 index 00000000..76766a15 --- /dev/null +++ b/migrations/035_fct_block_first_seen_by_node_monthly.down.sql @@ -0,0 +1,2 @@ +DROP TABLE IF EXISTS `${NETWORK_NAME}`.fct_block_first_seen_by_node_monthly ON CLUSTER '{cluster}'; +DROP TABLE IF EXISTS `${NETWORK_NAME}`.fct_block_first_seen_by_node_monthly_local ON CLUSTER '{cluster}'; diff --git a/migrations/035_fct_block_first_seen_by_node_monthly.up.sql b/migrations/035_fct_block_first_seen_by_node_monthly.up.sql new file mode 100644 index 00000000..1920f15f --- /dev/null +++ b/migrations/035_fct_block_first_seen_by_node_monthly.up.sql @@ -0,0 +1,56 @@ +CREATE TABLE `${NETWORK_NAME}`.fct_block_first_seen_by_node_monthly_local on cluster '{cluster}' ( + `updated_date_time` DateTime COMMENT 'Timestamp when the record was last updated' CODEC(DoubleDelta, ZSTD(1)), + `month` UInt32 COMMENT 'Year and month in YYYYMM format (e.g., 202507)' CODEC(ZSTD(1)), + `month_start_date_time` DateTime COMMENT 'Start of month at midnight UTC' CODEC(DoubleDelta, ZSTD(1)), + `username` LowCardinality(String) COMMENT 'Username of the node' CODEC(ZSTD(1)), + `node_id` String COMMENT 'ID of the node' CODEC(ZSTD(1)), + `classification` LowCardinality(String) COMMENT 'Classification of the node, e.g. "individual", "corporate", "internal" (aka ethPandaOps) or "unclassified"' CODEC(ZSTD(1)), + `meta_client_name` LowCardinality(String) COMMENT 'Name of the client', + `meta_client_implementation` LowCardinality(String) COMMENT 'Implementation of the client', + `meta_client_geo_city` LowCardinality(String) COMMENT 'City of the client' CODEC(ZSTD(1)), + `meta_client_geo_country` LowCardinality(String) COMMENT 'Country of the client' CODEC(ZSTD(1)), + `meta_client_geo_country_code` LowCardinality(String) COMMENT 'Country code of the client' CODEC(ZSTD(1)), + `meta_client_geo_continent_code` LowCardinality(String) COMMENT 'Continent code of the client' CODEC(ZSTD(1)), + `meta_client_geo_longitude` Nullable(Float64) COMMENT 'Longitude of the client' CODEC(ZSTD(1)), + `meta_client_geo_latitude` Nullable(Float64) COMMENT 'Latitude of the client' CODEC(ZSTD(1)), + `meta_client_geo_autonomous_system_number` Nullable(UInt32) COMMENT 'Autonomous system number of the client' CODEC(ZSTD(1)), + `meta_client_geo_autonomous_system_organization` Nullable(String) COMMENT 'Autonomous system organization of the client' CODEC(ZSTD(1)), + `min_slot` UInt64 COMMENT 'Minimum slot number in this month' CODEC(ZSTD(1)), + `max_slot` UInt64 COMMENT 'Maximum slot number in this month' CODEC(ZSTD(1)), + `day_count` UInt32 COMMENT 'Number of days in this month' CODEC(ZSTD(1)), + `epoch_count` UInt32 COMMENT 'Number of epochs in this month' CODEC(ZSTD(1)), + `slot_count` UInt32 COMMENT 'Number of slots with blocks seen in this month' CODEC(ZSTD(1)), + `min_seen_slot_start_diff_ms` UInt32 COMMENT 'Minimum time from slot start for the node to see a block (milliseconds)' CODEC(ZSTD(1)), + `p05_seen_slot_start_diff_ms` UInt32 COMMENT '5th percentile time from slot start (milliseconds)' CODEC(ZSTD(1)), + `p50_seen_slot_start_diff_ms` UInt32 COMMENT 'Median (p50) time from slot start (milliseconds)' CODEC(ZSTD(1)), + `avg_seen_slot_start_diff_ms` UInt32 COMMENT 'Average time from slot start (milliseconds)' CODEC(ZSTD(1)), + `p90_seen_slot_start_diff_ms` UInt32 COMMENT '90th percentile time from slot start (milliseconds)' CODEC(ZSTD(1)), + `p95_seen_slot_start_diff_ms` UInt32 COMMENT '95th percentile time from slot start (milliseconds)' CODEC(ZSTD(1)), + `p99_seen_slot_start_diff_ms` UInt32 COMMENT '99th percentile time from slot start (milliseconds)' CODEC(ZSTD(1)), + `max_seen_slot_start_diff_ms` UInt32 COMMENT 'Maximum time from slot start (milliseconds)' CODEC(ZSTD(1)) +) ENGINE = ReplicatedReplacingMergeTree( + '/clickhouse/{installation}/{cluster}/tables/{shard}/{database}/{table}', + '{replica}', + `updated_date_time` +) PARTITION BY month +ORDER BY + (`month`, `username`, `node_id`, `classification`, `meta_client_name`) +SETTINGS + deduplicate_merge_projection_mode = 'rebuild', + min_age_to_force_merge_seconds = 384, + min_age_to_force_merge_on_partition_only=false +COMMENT 'Block first seen statistics by node aggregated by month'; + +CREATE TABLE `${NETWORK_NAME}`.fct_block_first_seen_by_node_monthly ON CLUSTER '{cluster}' AS `${NETWORK_NAME}`.fct_block_first_seen_by_node_monthly_local ENGINE = Distributed( + '{cluster}', + '${NETWORK_NAME}', + fct_block_first_seen_by_node_monthly_local, + cityHash64(`month`, `username`, `node_id`, `classification`, `meta_client_name`) +); + +ALTER TABLE `${NETWORK_NAME}`.fct_block_first_seen_by_node_monthly_local ON CLUSTER '{cluster}' +ADD PROJECTION p_by_month_node +( + SELECT * + ORDER BY (`month`, `username`, `node_id`, `classification`, `meta_client_name`) +); diff --git a/migrations/036_fct_block_first_seen_by_node_by_epoch.down.sql b/migrations/036_fct_block_first_seen_by_node_by_epoch.down.sql new file mode 100644 index 00000000..1338d1f2 --- /dev/null +++ b/migrations/036_fct_block_first_seen_by_node_by_epoch.down.sql @@ -0,0 +1,2 @@ +DROP TABLE IF EXISTS `${NETWORK_NAME}`.fct_block_first_seen_by_node_by_epoch ON CLUSTER '{cluster}'; +DROP TABLE IF EXISTS `${NETWORK_NAME}`.fct_block_first_seen_by_node_by_epoch_local ON CLUSTER '{cluster}'; diff --git a/migrations/036_fct_block_first_seen_by_node_by_epoch.up.sql b/migrations/036_fct_block_first_seen_by_node_by_epoch.up.sql new file mode 100644 index 00000000..ee7731a5 --- /dev/null +++ b/migrations/036_fct_block_first_seen_by_node_by_epoch.up.sql @@ -0,0 +1,54 @@ +CREATE TABLE `${NETWORK_NAME}`.fct_block_first_seen_by_node_by_epoch_local on cluster '{cluster}' ( + `updated_date_time` DateTime COMMENT 'Timestamp when the record was last updated' CODEC(DoubleDelta, ZSTD(1)), + `epoch` UInt32 COMMENT 'Epoch number' CODEC(DoubleDelta, ZSTD(1)), + `epoch_start_date_time` DateTime COMMENT 'The wall clock time when the epoch started' CODEC(DoubleDelta, ZSTD(1)), + `username` LowCardinality(String) COMMENT 'Username of the node' CODEC(ZSTD(1)), + `node_id` String COMMENT 'ID of the node' CODEC(ZSTD(1)), + `classification` LowCardinality(String) COMMENT 'Classification of the node, e.g. "individual", "corporate", "internal" (aka ethPandaOps) or "unclassified"' CODEC(ZSTD(1)), + `meta_client_name` LowCardinality(String) COMMENT 'Name of the client', + `meta_client_implementation` LowCardinality(String) COMMENT 'Implementation of the client', + `meta_client_geo_city` LowCardinality(String) COMMENT 'City of the client' CODEC(ZSTD(1)), + `meta_client_geo_country` LowCardinality(String) COMMENT 'Country of the client' CODEC(ZSTD(1)), + `meta_client_geo_country_code` LowCardinality(String) COMMENT 'Country code of the client' CODEC(ZSTD(1)), + `meta_client_geo_continent_code` LowCardinality(String) COMMENT 'Continent code of the client' CODEC(ZSTD(1)), + `meta_client_geo_longitude` Nullable(Float64) COMMENT 'Longitude of the client' CODEC(ZSTD(1)), + `meta_client_geo_latitude` Nullable(Float64) COMMENT 'Latitude of the client' CODEC(ZSTD(1)), + `meta_client_geo_autonomous_system_number` Nullable(UInt32) COMMENT 'Autonomous system number of the client' CODEC(ZSTD(1)), + `meta_client_geo_autonomous_system_organization` Nullable(String) COMMENT 'Autonomous system organization of the client' CODEC(ZSTD(1)), + `min_slot` UInt64 COMMENT 'Minimum slot number in this epoch' CODEC(ZSTD(1)), + `max_slot` UInt64 COMMENT 'Maximum slot number in this epoch' CODEC(ZSTD(1)), + `slot_count` UInt32 COMMENT 'Number of slots with blocks seen in this epoch' CODEC(ZSTD(1)), + `min_seen_slot_start_diff_ms` UInt32 COMMENT 'Minimum time from slot start for the node to see a block (milliseconds)' CODEC(ZSTD(1)), + `p05_seen_slot_start_diff_ms` UInt32 COMMENT '5th percentile time from slot start (milliseconds)' CODEC(ZSTD(1)), + `p50_seen_slot_start_diff_ms` UInt32 COMMENT 'Median (p50) time from slot start (milliseconds)' CODEC(ZSTD(1)), + `avg_seen_slot_start_diff_ms` UInt32 COMMENT 'Average time from slot start (milliseconds)' CODEC(ZSTD(1)), + `p90_seen_slot_start_diff_ms` UInt32 COMMENT '90th percentile time from slot start (milliseconds)' CODEC(ZSTD(1)), + `p95_seen_slot_start_diff_ms` UInt32 COMMENT '95th percentile time from slot start (milliseconds)' CODEC(ZSTD(1)), + `p99_seen_slot_start_diff_ms` UInt32 COMMENT '99th percentile time from slot start (milliseconds)' CODEC(ZSTD(1)), + `max_seen_slot_start_diff_ms` UInt32 COMMENT 'Maximum time from slot start (milliseconds)' CODEC(ZSTD(1)) +) ENGINE = ReplicatedReplacingMergeTree( + '/clickhouse/{installation}/{cluster}/tables/{shard}/{database}/{table}', + '{replica}', + `updated_date_time` +) PARTITION BY toStartOfMonth(epoch_start_date_time) +ORDER BY + (`epoch_start_date_time`, `username`, `node_id`, `classification`, `meta_client_name`) +SETTINGS + deduplicate_merge_projection_mode = 'rebuild', + min_age_to_force_merge_seconds = 384, + min_age_to_force_merge_on_partition_only=false +COMMENT 'Block first seen statistics by node aggregated by epoch'; + +CREATE TABLE `${NETWORK_NAME}`.fct_block_first_seen_by_node_by_epoch ON CLUSTER '{cluster}' AS `${NETWORK_NAME}`.fct_block_first_seen_by_node_by_epoch_local ENGINE = Distributed( + '{cluster}', + '${NETWORK_NAME}', + fct_block_first_seen_by_node_by_epoch_local, + cityHash64(`epoch_start_date_time`, `username`, `node_id`, `classification`, `meta_client_name`) +); + +ALTER TABLE `${NETWORK_NAME}`.fct_block_first_seen_by_node_by_epoch_local ON CLUSTER '{cluster}' +ADD PROJECTION p_by_epoch_node +( + SELECT * + ORDER BY (`epoch`, `username`, `node_id`, `classification`, `meta_client_name`) +); diff --git a/models/transformations/fct_block_first_seen_by_node_by_epoch.sql b/models/transformations/fct_block_first_seen_by_node_by_epoch.sql new file mode 100644 index 00000000..d36596bd --- /dev/null +++ b/models/transformations/fct_block_first_seen_by_node_by_epoch.sql @@ -0,0 +1,93 @@ +--- +table: fct_block_first_seen_by_node_by_epoch +type: incremental +interval: + type: slot + max: 50000 +schedules: + forwardfill: "@every 5s" + backfill: "@every 30s" +tags: + - epoch + - block +dependencies: + - "{{transformation}}.fct_block_first_seen_by_node" +--- +INSERT INTO `{{ .self.database }}`.`{{ .self.table }}` +SELECT + fromUnixTimestamp({{ .task.start }}) as updated_date_time, + epoch, + epoch_start_date_time, + username, + node_id, + classification, + meta_client_name, + meta_client_implementation, + meta_client_geo_city, + meta_client_geo_country, + meta_client_geo_country_code, + meta_client_geo_continent_code, + meta_client_geo_longitude, + meta_client_geo_latitude, + meta_client_geo_autonomous_system_number, + meta_client_geo_autonomous_system_organization, + min_slot, + max_slot, + slot_count, + min_seen_slot_start_diff_ms, + p05_seen_slot_start_diff_ms, + p50_seen_slot_start_diff_ms, + avg_seen_slot_start_diff_ms, + p90_seen_slot_start_diff_ms, + p95_seen_slot_start_diff_ms, + p99_seen_slot_start_diff_ms, + max_seen_slot_start_diff_ms +FROM ( + SELECT + epoch, + epoch_start_date_time, + username, + node_id, + classification, + meta_client_name, + argMin(meta_client_implementation, seen_slot_start_diff) AS meta_client_implementation, + argMin(meta_client_geo_city, seen_slot_start_diff) AS meta_client_geo_city, + argMin(meta_client_geo_country, seen_slot_start_diff) AS meta_client_geo_country, + argMin(meta_client_geo_country_code, seen_slot_start_diff) AS meta_client_geo_country_code, + argMin(meta_client_geo_continent_code, seen_slot_start_diff) AS meta_client_geo_continent_code, + argMin(meta_client_geo_longitude, seen_slot_start_diff) AS meta_client_geo_longitude, + argMin(meta_client_geo_latitude, seen_slot_start_diff) AS meta_client_geo_latitude, + argMin(meta_client_geo_autonomous_system_number, seen_slot_start_diff) AS meta_client_geo_autonomous_system_number, + argMin(meta_client_geo_autonomous_system_organization, seen_slot_start_diff) AS meta_client_geo_autonomous_system_organization, + min(slot) AS min_slot, + max(slot) AS max_slot, + count(*) AS slot_count, + min(seen_slot_start_diff) AS min_seen_slot_start_diff_ms, + quantile(0.05)(seen_slot_start_diff) AS p05_seen_slot_start_diff_ms, + quantile(0.50)(seen_slot_start_diff) AS p50_seen_slot_start_diff_ms, + round(avg(seen_slot_start_diff)) AS avg_seen_slot_start_diff_ms, + quantile(0.90)(seen_slot_start_diff) AS p90_seen_slot_start_diff_ms, + quantile(0.95)(seen_slot_start_diff) AS p95_seen_slot_start_diff_ms, + quantile(0.99)(seen_slot_start_diff) AS p99_seen_slot_start_diff_ms, + max(seen_slot_start_diff) AS max_seen_slot_start_diff_ms +FROM {{ index .dep "{{transformation}}" "fct_block_first_seen_by_node" "helpers" "from" }} AS base FINAL +WHERE slot_start_date_time >= fromUnixTimestamp({{ .bounds.start }}) - INTERVAL 1 DAY + AND slot_start_date_time <= fromUnixTimestamp({{ .bounds.end }}) + INTERVAL 1 DAY + AND epoch >= ( + SELECT min(epoch) + FROM {{ index .dep "{{transformation}}" "fct_block_first_seen_by_node" "helpers" "from" }} FINAL + WHERE slot_start_date_time >= fromUnixTimestamp({{ .bounds.start }}) + ) + AND epoch <= ( + SELECT max(epoch) + FROM {{ index .dep "{{transformation}}" "fct_block_first_seen_by_node" "helpers" "from" }} FINAL + WHERE slot_start_date_time <= fromUnixTimestamp({{ .bounds.end }}) + ) +GROUP BY + epoch, + epoch_start_date_time, + username, + node_id, + classification, + meta_client_name +) diff --git a/models/transformations/fct_block_first_seen_by_node_daily.sql b/models/transformations/fct_block_first_seen_by_node_daily.sql new file mode 100644 index 00000000..a614c739 --- /dev/null +++ b/models/transformations/fct_block_first_seen_by_node_daily.sql @@ -0,0 +1,85 @@ +--- +table: fct_block_first_seen_by_node_daily +type: incremental +interval: + type: slot + max: 15000 +schedules: + forwardfill: "@every 5s" + backfill: "@every 30s" +tags: + - daily + - block +dependencies: + - "{{transformation}}.fct_block_first_seen_by_node" +--- +INSERT INTO `{{ .self.database }}`.`{{ .self.table }}` +SELECT + fromUnixTimestamp({{ .task.start }}) as updated_date_time, + day, + day_start_date_time, + username, + node_id, + classification, + meta_client_name, + meta_client_implementation, + meta_client_geo_city, + meta_client_geo_country, + meta_client_geo_country_code, + meta_client_geo_continent_code, + meta_client_geo_longitude, + meta_client_geo_latitude, + meta_client_geo_autonomous_system_number, + meta_client_geo_autonomous_system_organization, + min_slot, + max_slot, + epoch_count, + slot_count, + min_seen_slot_start_diff_ms, + p05_seen_slot_start_diff_ms, + p50_seen_slot_start_diff_ms, + avg_seen_slot_start_diff_ms, + p90_seen_slot_start_diff_ms, + p95_seen_slot_start_diff_ms, + p99_seen_slot_start_diff_ms, + max_seen_slot_start_diff_ms +FROM ( + SELECT + toDate(slot_start_date_time) as day, + toStartOfDay(slot_start_date_time) as day_start_date_time, + username, + node_id, + classification, + meta_client_name, + argMin(meta_client_implementation, seen_slot_start_diff) AS meta_client_implementation, + argMin(meta_client_geo_city, seen_slot_start_diff) AS meta_client_geo_city, + argMin(meta_client_geo_country, seen_slot_start_diff) AS meta_client_geo_country, + argMin(meta_client_geo_country_code, seen_slot_start_diff) AS meta_client_geo_country_code, + argMin(meta_client_geo_continent_code, seen_slot_start_diff) AS meta_client_geo_continent_code, + argMin(meta_client_geo_longitude, seen_slot_start_diff) AS meta_client_geo_longitude, + argMin(meta_client_geo_latitude, seen_slot_start_diff) AS meta_client_geo_latitude, + argMin(meta_client_geo_autonomous_system_number, seen_slot_start_diff) AS meta_client_geo_autonomous_system_number, + argMin(meta_client_geo_autonomous_system_organization, seen_slot_start_diff) AS meta_client_geo_autonomous_system_organization, + min(slot) AS min_slot, + max(slot) AS max_slot, + countDistinct(epoch) AS epoch_count, + count(*) AS slot_count, + min(seen_slot_start_diff) AS min_seen_slot_start_diff_ms, + quantile(0.05)(seen_slot_start_diff) AS p05_seen_slot_start_diff_ms, + quantile(0.50)(seen_slot_start_diff) AS p50_seen_slot_start_diff_ms, + round(avg(seen_slot_start_diff)) AS avg_seen_slot_start_diff_ms, + quantile(0.90)(seen_slot_start_diff) AS p90_seen_slot_start_diff_ms, + quantile(0.95)(seen_slot_start_diff) AS p95_seen_slot_start_diff_ms, + quantile(0.99)(seen_slot_start_diff) AS p99_seen_slot_start_diff_ms, + max(seen_slot_start_diff) AS max_seen_slot_start_diff_ms +FROM {{ index .dep "{{transformation}}" "fct_block_first_seen_by_node" "helpers" "from" }} FINAL +WHERE slot_start_date_time >= toStartOfDay(fromUnixTimestamp({{ .bounds.start }})) + AND slot_start_date_time < toStartOfDay(fromUnixTimestamp({{ .bounds.end }})) + INTERVAL 1 DAY +GROUP BY + toDate(slot_start_date_time), + toStartOfDay(slot_start_date_time), + username, + node_id, + classification, + meta_client_name +) diff --git a/models/transformations/fct_block_first_seen_by_node_monthly.sql b/models/transformations/fct_block_first_seen_by_node_monthly.sql new file mode 100644 index 00000000..c46a3f9c --- /dev/null +++ b/models/transformations/fct_block_first_seen_by_node_monthly.sql @@ -0,0 +1,87 @@ +--- +table: fct_block_first_seen_by_node_monthly +type: incremental +interval: + type: slot + max: 250000 +schedules: + forwardfill: "@every 5s" + backfill: "@every 30s" +tags: + - monthly + - block +dependencies: + - "{{transformation}}.fct_block_first_seen_by_node" +--- +INSERT INTO `{{ .self.database }}`.`{{ .self.table }}` +SELECT + fromUnixTimestamp({{ .task.start }}) as updated_date_time, + month, + month_start_date_time, + username, + node_id, + classification, + meta_client_name, + meta_client_implementation, + meta_client_geo_city, + meta_client_geo_country, + meta_client_geo_country_code, + meta_client_geo_continent_code, + meta_client_geo_longitude, + meta_client_geo_latitude, + meta_client_geo_autonomous_system_number, + meta_client_geo_autonomous_system_organization, + min_slot, + max_slot, + day_count, + epoch_count, + slot_count, + min_seen_slot_start_diff_ms, + p05_seen_slot_start_diff_ms, + p50_seen_slot_start_diff_ms, + avg_seen_slot_start_diff_ms, + p90_seen_slot_start_diff_ms, + p95_seen_slot_start_diff_ms, + p99_seen_slot_start_diff_ms, + max_seen_slot_start_diff_ms +FROM ( + SELECT + toYYYYMM(toDate(slot_start_date_time)) as month, + toDateTime(toStartOfMonth(toDate(slot_start_date_time))) as month_start_date_time, + username, + node_id, + classification, + meta_client_name, + argMin(meta_client_implementation, seen_slot_start_diff) AS meta_client_implementation, + argMin(meta_client_geo_city, seen_slot_start_diff) AS meta_client_geo_city, + argMin(meta_client_geo_country, seen_slot_start_diff) AS meta_client_geo_country, + argMin(meta_client_geo_country_code, seen_slot_start_diff) AS meta_client_geo_country_code, + argMin(meta_client_geo_continent_code, seen_slot_start_diff) AS meta_client_geo_continent_code, + argMin(meta_client_geo_longitude, seen_slot_start_diff) AS meta_client_geo_longitude, + argMin(meta_client_geo_latitude, seen_slot_start_diff) AS meta_client_geo_latitude, + argMin(meta_client_geo_autonomous_system_number, seen_slot_start_diff) AS meta_client_geo_autonomous_system_number, + argMin(meta_client_geo_autonomous_system_organization, seen_slot_start_diff) AS meta_client_geo_autonomous_system_organization, + min(slot) AS min_slot, + max(slot) AS max_slot, + countDistinct(toDate(slot_start_date_time)) AS day_count, + countDistinct(epoch) AS epoch_count, + count(*) AS slot_count, + min(seen_slot_start_diff) AS min_seen_slot_start_diff_ms, + quantile(0.05)(seen_slot_start_diff) AS p05_seen_slot_start_diff_ms, + quantile(0.50)(seen_slot_start_diff) AS p50_seen_slot_start_diff_ms, + round(avg(seen_slot_start_diff)) AS avg_seen_slot_start_diff_ms, + quantile(0.90)(seen_slot_start_diff) AS p90_seen_slot_start_diff_ms, + quantile(0.95)(seen_slot_start_diff) AS p95_seen_slot_start_diff_ms, + quantile(0.99)(seen_slot_start_diff) AS p99_seen_slot_start_diff_ms, + max(seen_slot_start_diff) AS max_seen_slot_start_diff_ms +FROM {{ index .dep "{{transformation}}" "fct_block_first_seen_by_node" "helpers" "from" }} FINAL +WHERE slot_start_date_time >= toStartOfMonth(fromUnixTimestamp({{ .bounds.start }})) + AND slot_start_date_time < toStartOfMonth(fromUnixTimestamp({{ .bounds.end }})) + INTERVAL 1 MONTH +GROUP BY + toYYYYMM(toDate(slot_start_date_time)), + toDateTime(toStartOfMonth(toDate(slot_start_date_time))), + username, + node_id, + classification, + meta_client_name +) diff --git a/models/transformations/fct_block_first_seen_by_node_weekly.sql b/models/transformations/fct_block_first_seen_by_node_weekly.sql new file mode 100644 index 00000000..6b18026b --- /dev/null +++ b/models/transformations/fct_block_first_seen_by_node_weekly.sql @@ -0,0 +1,87 @@ +--- +table: fct_block_first_seen_by_node_weekly +type: incremental +interval: + type: slot + max: 60000 +schedules: + forwardfill: "@every 5s" + backfill: "@every 30s" +tags: + - weekly + - block +dependencies: + - "{{transformation}}.fct_block_first_seen_by_node" +--- +INSERT INTO `{{ .self.database }}`.`{{ .self.table }}` +SELECT + fromUnixTimestamp({{ .task.start }}) as updated_date_time, + week, + week_start_date_time, + username, + node_id, + classification, + meta_client_name, + meta_client_implementation, + meta_client_geo_city, + meta_client_geo_country, + meta_client_geo_country_code, + meta_client_geo_continent_code, + meta_client_geo_longitude, + meta_client_geo_latitude, + meta_client_geo_autonomous_system_number, + meta_client_geo_autonomous_system_organization, + min_slot, + max_slot, + day_count, + epoch_count, + slot_count, + min_seen_slot_start_diff_ms, + p05_seen_slot_start_diff_ms, + p50_seen_slot_start_diff_ms, + avg_seen_slot_start_diff_ms, + p90_seen_slot_start_diff_ms, + p95_seen_slot_start_diff_ms, + p99_seen_slot_start_diff_ms, + max_seen_slot_start_diff_ms +FROM ( + SELECT + toMonday(toDate(slot_start_date_time)) as week, + toDateTime(toMonday(toDate(slot_start_date_time))) as week_start_date_time, + username, + node_id, + classification, + meta_client_name, + argMin(meta_client_implementation, seen_slot_start_diff) AS meta_client_implementation, + argMin(meta_client_geo_city, seen_slot_start_diff) AS meta_client_geo_city, + argMin(meta_client_geo_country, seen_slot_start_diff) AS meta_client_geo_country, + argMin(meta_client_geo_country_code, seen_slot_start_diff) AS meta_client_geo_country_code, + argMin(meta_client_geo_continent_code, seen_slot_start_diff) AS meta_client_geo_continent_code, + argMin(meta_client_geo_longitude, seen_slot_start_diff) AS meta_client_geo_longitude, + argMin(meta_client_geo_latitude, seen_slot_start_diff) AS meta_client_geo_latitude, + argMin(meta_client_geo_autonomous_system_number, seen_slot_start_diff) AS meta_client_geo_autonomous_system_number, + argMin(meta_client_geo_autonomous_system_organization, seen_slot_start_diff) AS meta_client_geo_autonomous_system_organization, + min(slot) AS min_slot, + max(slot) AS max_slot, + countDistinct(toDate(slot_start_date_time)) AS day_count, + countDistinct(epoch) AS epoch_count, + count(*) AS slot_count, + min(seen_slot_start_diff) AS min_seen_slot_start_diff_ms, + quantile(0.05)(seen_slot_start_diff) AS p05_seen_slot_start_diff_ms, + quantile(0.50)(seen_slot_start_diff) AS p50_seen_slot_start_diff_ms, + round(avg(seen_slot_start_diff)) AS avg_seen_slot_start_diff_ms, + quantile(0.90)(seen_slot_start_diff) AS p90_seen_slot_start_diff_ms, + quantile(0.95)(seen_slot_start_diff) AS p95_seen_slot_start_diff_ms, + quantile(0.99)(seen_slot_start_diff) AS p99_seen_slot_start_diff_ms, + max(seen_slot_start_diff) AS max_seen_slot_start_diff_ms +FROM {{ index .dep "{{transformation}}" "fct_block_first_seen_by_node" "helpers" "from" }} FINAL +WHERE slot_start_date_time >= toStartOfWeek(fromUnixTimestamp({{ .bounds.start }})) + AND slot_start_date_time < toStartOfWeek(fromUnixTimestamp({{ .bounds.end }})) + INTERVAL 1 WEEK +GROUP BY + toMonday(toDate(slot_start_date_time)), + toDateTime(toMonday(toDate(slot_start_date_time))), + username, + node_id, + classification, + meta_client_name +) diff --git a/pkg/proto/clickhouse/fct_block_first_seen_by_node_by_epoch.go b/pkg/proto/clickhouse/fct_block_first_seen_by_node_by_epoch.go new file mode 100644 index 00000000..27745efb --- /dev/null +++ b/pkg/proto/clickhouse/fct_block_first_seen_by_node_by_epoch.go @@ -0,0 +1,865 @@ +// Code generated by clickhouse-proto-gen. DO NOT EDIT. +// SQL query builder for fct_block_first_seen_by_node_by_epoch + +package clickhouse + +import ( + "fmt" +) + +// BuildListFctBlockFirstSeenByNodeByEpochQuery constructs a parameterized SQL query from a ListFctBlockFirstSeenByNodeByEpochRequest +// +// Available projections: +// - p_by_epoch_node (primary key: epoch) +// +// Use WithProjection() option to select a specific projection. +func BuildListFctBlockFirstSeenByNodeByEpochQuery(req *ListFctBlockFirstSeenByNodeByEpochRequest, options ...QueryOption) (SQLQuery, error) { + // Validate that at least one primary key is provided + // Primary keys can come from base table or projections + if req.Epoch == nil && req.EpochStartDateTime == nil { + return SQLQuery{}, fmt.Errorf("at least one primary key field is required: epoch, epoch_start_date_time") + } + + // Build query using QueryBuilder + qb := NewQueryBuilder() + + // Add primary key filter + if req.EpochStartDateTime != nil { + switch filter := req.EpochStartDateTime.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("epoch_start_date_time", "=", DateTimeValue{filter.Eq}) + case *UInt32Filter_Ne: + qb.AddCondition("epoch_start_date_time", "!=", DateTimeValue{filter.Ne}) + case *UInt32Filter_Lt: + qb.AddCondition("epoch_start_date_time", "<", DateTimeValue{filter.Lt}) + case *UInt32Filter_Lte: + qb.AddCondition("epoch_start_date_time", "<=", DateTimeValue{filter.Lte}) + case *UInt32Filter_Gt: + qb.AddCondition("epoch_start_date_time", ">", DateTimeValue{filter.Gt}) + case *UInt32Filter_Gte: + qb.AddCondition("epoch_start_date_time", ">=", DateTimeValue{filter.Gte}) + case *UInt32Filter_Between: + qb.AddBetweenCondition("epoch_start_date_time", DateTimeValue{filter.Between.Min}, DateTimeValue{filter.Between.Max.GetValue()}) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + converted := make([]interface{}, len(filter.In.Values)) + for i, v := range filter.In.Values { + converted[i] = DateTimeValue{v} + } + qb.AddInCondition("epoch_start_date_time", converted) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + converted := make([]interface{}, len(filter.NotIn.Values)) + for i, v := range filter.NotIn.Values { + converted[i] = DateTimeValue{v} + } + qb.AddNotInCondition("epoch_start_date_time", converted) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: updated_date_time + if req.UpdatedDateTime != nil { + switch filter := req.UpdatedDateTime.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("updated_date_time", "=", DateTimeValue{filter.Eq}) + case *UInt32Filter_Ne: + qb.AddCondition("updated_date_time", "!=", DateTimeValue{filter.Ne}) + case *UInt32Filter_Lt: + qb.AddCondition("updated_date_time", "<", DateTimeValue{filter.Lt}) + case *UInt32Filter_Lte: + qb.AddCondition("updated_date_time", "<=", DateTimeValue{filter.Lte}) + case *UInt32Filter_Gt: + qb.AddCondition("updated_date_time", ">", DateTimeValue{filter.Gt}) + case *UInt32Filter_Gte: + qb.AddCondition("updated_date_time", ">=", DateTimeValue{filter.Gte}) + case *UInt32Filter_Between: + qb.AddBetweenCondition("updated_date_time", DateTimeValue{filter.Between.Min}, DateTimeValue{filter.Between.Max.GetValue()}) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + converted := make([]interface{}, len(filter.In.Values)) + for i, v := range filter.In.Values { + converted[i] = DateTimeValue{v} + } + qb.AddInCondition("updated_date_time", converted) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + converted := make([]interface{}, len(filter.NotIn.Values)) + for i, v := range filter.NotIn.Values { + converted[i] = DateTimeValue{v} + } + qb.AddNotInCondition("updated_date_time", converted) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: epoch + if req.Epoch != nil { + switch filter := req.Epoch.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("epoch", "=", filter.Eq) + case *UInt32Filter_Ne: + qb.AddCondition("epoch", "!=", filter.Ne) + case *UInt32Filter_Lt: + qb.AddCondition("epoch", "<", filter.Lt) + case *UInt32Filter_Lte: + qb.AddCondition("epoch", "<=", filter.Lte) + case *UInt32Filter_Gt: + qb.AddCondition("epoch", ">", filter.Gt) + case *UInt32Filter_Gte: + qb.AddCondition("epoch", ">=", filter.Gte) + case *UInt32Filter_Between: + qb.AddBetweenCondition("epoch", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("epoch", UInt32SliceToInterface(filter.In.Values)) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("epoch", UInt32SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: username + if req.Username != nil { + switch filter := req.Username.Filter.(type) { + case *StringFilter_Eq: + qb.AddCondition("username", "=", filter.Eq) + case *StringFilter_Ne: + qb.AddCondition("username", "!=", filter.Ne) + case *StringFilter_Contains: + qb.AddLikeCondition("username", "%" + filter.Contains + "%") + case *StringFilter_StartsWith: + qb.AddLikeCondition("username", filter.StartsWith + "%") + case *StringFilter_EndsWith: + qb.AddLikeCondition("username", "%" + filter.EndsWith) + case *StringFilter_Like: + qb.AddLikeCondition("username", filter.Like) + case *StringFilter_NotLike: + qb.AddNotLikeCondition("username", filter.NotLike) + case *StringFilter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("username", StringSliceToInterface(filter.In.Values)) + } + case *StringFilter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("username", StringSliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: node_id + if req.NodeId != nil { + switch filter := req.NodeId.Filter.(type) { + case *StringFilter_Eq: + qb.AddCondition("node_id", "=", filter.Eq) + case *StringFilter_Ne: + qb.AddCondition("node_id", "!=", filter.Ne) + case *StringFilter_Contains: + qb.AddLikeCondition("node_id", "%" + filter.Contains + "%") + case *StringFilter_StartsWith: + qb.AddLikeCondition("node_id", filter.StartsWith + "%") + case *StringFilter_EndsWith: + qb.AddLikeCondition("node_id", "%" + filter.EndsWith) + case *StringFilter_Like: + qb.AddLikeCondition("node_id", filter.Like) + case *StringFilter_NotLike: + qb.AddNotLikeCondition("node_id", filter.NotLike) + case *StringFilter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("node_id", StringSliceToInterface(filter.In.Values)) + } + case *StringFilter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("node_id", StringSliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: classification + if req.Classification != nil { + switch filter := req.Classification.Filter.(type) { + case *StringFilter_Eq: + qb.AddCondition("classification", "=", filter.Eq) + case *StringFilter_Ne: + qb.AddCondition("classification", "!=", filter.Ne) + case *StringFilter_Contains: + qb.AddLikeCondition("classification", "%" + filter.Contains + "%") + case *StringFilter_StartsWith: + qb.AddLikeCondition("classification", filter.StartsWith + "%") + case *StringFilter_EndsWith: + qb.AddLikeCondition("classification", "%" + filter.EndsWith) + case *StringFilter_Like: + qb.AddLikeCondition("classification", filter.Like) + case *StringFilter_NotLike: + qb.AddNotLikeCondition("classification", filter.NotLike) + case *StringFilter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("classification", StringSliceToInterface(filter.In.Values)) + } + case *StringFilter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("classification", StringSliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: meta_client_name + if req.MetaClientName != nil { + switch filter := req.MetaClientName.Filter.(type) { + case *StringFilter_Eq: + qb.AddCondition("meta_client_name", "=", filter.Eq) + case *StringFilter_Ne: + qb.AddCondition("meta_client_name", "!=", filter.Ne) + case *StringFilter_Contains: + qb.AddLikeCondition("meta_client_name", "%" + filter.Contains + "%") + case *StringFilter_StartsWith: + qb.AddLikeCondition("meta_client_name", filter.StartsWith + "%") + case *StringFilter_EndsWith: + qb.AddLikeCondition("meta_client_name", "%" + filter.EndsWith) + case *StringFilter_Like: + qb.AddLikeCondition("meta_client_name", filter.Like) + case *StringFilter_NotLike: + qb.AddNotLikeCondition("meta_client_name", filter.NotLike) + case *StringFilter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("meta_client_name", StringSliceToInterface(filter.In.Values)) + } + case *StringFilter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("meta_client_name", StringSliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: meta_client_implementation + if req.MetaClientImplementation != nil { + switch filter := req.MetaClientImplementation.Filter.(type) { + case *StringFilter_Eq: + qb.AddCondition("meta_client_implementation", "=", filter.Eq) + case *StringFilter_Ne: + qb.AddCondition("meta_client_implementation", "!=", filter.Ne) + case *StringFilter_Contains: + qb.AddLikeCondition("meta_client_implementation", "%" + filter.Contains + "%") + case *StringFilter_StartsWith: + qb.AddLikeCondition("meta_client_implementation", filter.StartsWith + "%") + case *StringFilter_EndsWith: + qb.AddLikeCondition("meta_client_implementation", "%" + filter.EndsWith) + case *StringFilter_Like: + qb.AddLikeCondition("meta_client_implementation", filter.Like) + case *StringFilter_NotLike: + qb.AddNotLikeCondition("meta_client_implementation", filter.NotLike) + case *StringFilter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("meta_client_implementation", StringSliceToInterface(filter.In.Values)) + } + case *StringFilter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("meta_client_implementation", StringSliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: meta_client_geo_city + if req.MetaClientGeoCity != nil { + switch filter := req.MetaClientGeoCity.Filter.(type) { + case *StringFilter_Eq: + qb.AddCondition("meta_client_geo_city", "=", filter.Eq) + case *StringFilter_Ne: + qb.AddCondition("meta_client_geo_city", "!=", filter.Ne) + case *StringFilter_Contains: + qb.AddLikeCondition("meta_client_geo_city", "%" + filter.Contains + "%") + case *StringFilter_StartsWith: + qb.AddLikeCondition("meta_client_geo_city", filter.StartsWith + "%") + case *StringFilter_EndsWith: + qb.AddLikeCondition("meta_client_geo_city", "%" + filter.EndsWith) + case *StringFilter_Like: + qb.AddLikeCondition("meta_client_geo_city", filter.Like) + case *StringFilter_NotLike: + qb.AddNotLikeCondition("meta_client_geo_city", filter.NotLike) + case *StringFilter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("meta_client_geo_city", StringSliceToInterface(filter.In.Values)) + } + case *StringFilter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("meta_client_geo_city", StringSliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: meta_client_geo_country + if req.MetaClientGeoCountry != nil { + switch filter := req.MetaClientGeoCountry.Filter.(type) { + case *StringFilter_Eq: + qb.AddCondition("meta_client_geo_country", "=", filter.Eq) + case *StringFilter_Ne: + qb.AddCondition("meta_client_geo_country", "!=", filter.Ne) + case *StringFilter_Contains: + qb.AddLikeCondition("meta_client_geo_country", "%" + filter.Contains + "%") + case *StringFilter_StartsWith: + qb.AddLikeCondition("meta_client_geo_country", filter.StartsWith + "%") + case *StringFilter_EndsWith: + qb.AddLikeCondition("meta_client_geo_country", "%" + filter.EndsWith) + case *StringFilter_Like: + qb.AddLikeCondition("meta_client_geo_country", filter.Like) + case *StringFilter_NotLike: + qb.AddNotLikeCondition("meta_client_geo_country", filter.NotLike) + case *StringFilter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("meta_client_geo_country", StringSliceToInterface(filter.In.Values)) + } + case *StringFilter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("meta_client_geo_country", StringSliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: meta_client_geo_country_code + if req.MetaClientGeoCountryCode != nil { + switch filter := req.MetaClientGeoCountryCode.Filter.(type) { + case *StringFilter_Eq: + qb.AddCondition("meta_client_geo_country_code", "=", filter.Eq) + case *StringFilter_Ne: + qb.AddCondition("meta_client_geo_country_code", "!=", filter.Ne) + case *StringFilter_Contains: + qb.AddLikeCondition("meta_client_geo_country_code", "%" + filter.Contains + "%") + case *StringFilter_StartsWith: + qb.AddLikeCondition("meta_client_geo_country_code", filter.StartsWith + "%") + case *StringFilter_EndsWith: + qb.AddLikeCondition("meta_client_geo_country_code", "%" + filter.EndsWith) + case *StringFilter_Like: + qb.AddLikeCondition("meta_client_geo_country_code", filter.Like) + case *StringFilter_NotLike: + qb.AddNotLikeCondition("meta_client_geo_country_code", filter.NotLike) + case *StringFilter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("meta_client_geo_country_code", StringSliceToInterface(filter.In.Values)) + } + case *StringFilter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("meta_client_geo_country_code", StringSliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: meta_client_geo_continent_code + if req.MetaClientGeoContinentCode != nil { + switch filter := req.MetaClientGeoContinentCode.Filter.(type) { + case *StringFilter_Eq: + qb.AddCondition("meta_client_geo_continent_code", "=", filter.Eq) + case *StringFilter_Ne: + qb.AddCondition("meta_client_geo_continent_code", "!=", filter.Ne) + case *StringFilter_Contains: + qb.AddLikeCondition("meta_client_geo_continent_code", "%" + filter.Contains + "%") + case *StringFilter_StartsWith: + qb.AddLikeCondition("meta_client_geo_continent_code", filter.StartsWith + "%") + case *StringFilter_EndsWith: + qb.AddLikeCondition("meta_client_geo_continent_code", "%" + filter.EndsWith) + case *StringFilter_Like: + qb.AddLikeCondition("meta_client_geo_continent_code", filter.Like) + case *StringFilter_NotLike: + qb.AddNotLikeCondition("meta_client_geo_continent_code", filter.NotLike) + case *StringFilter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("meta_client_geo_continent_code", StringSliceToInterface(filter.In.Values)) + } + case *StringFilter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("meta_client_geo_continent_code", StringSliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: meta_client_geo_longitude + + // Add filter for column: meta_client_geo_latitude + + // Add filter for column: meta_client_geo_autonomous_system_number + if req.MetaClientGeoAutonomousSystemNumber != nil { + switch filter := req.MetaClientGeoAutonomousSystemNumber.Filter.(type) { + case *NullableUInt32Filter_Eq: + qb.AddCondition("meta_client_geo_autonomous_system_number", "=", filter.Eq) + case *NullableUInt32Filter_Ne: + qb.AddCondition("meta_client_geo_autonomous_system_number", "!=", filter.Ne) + case *NullableUInt32Filter_Lt: + qb.AddCondition("meta_client_geo_autonomous_system_number", "<", filter.Lt) + case *NullableUInt32Filter_Lte: + qb.AddCondition("meta_client_geo_autonomous_system_number", "<=", filter.Lte) + case *NullableUInt32Filter_Gt: + qb.AddCondition("meta_client_geo_autonomous_system_number", ">", filter.Gt) + case *NullableUInt32Filter_Gte: + qb.AddCondition("meta_client_geo_autonomous_system_number", ">=", filter.Gte) + case *NullableUInt32Filter_Between: + qb.AddBetweenCondition("meta_client_geo_autonomous_system_number", filter.Between.Min, filter.Between.Max.GetValue()) + case *NullableUInt32Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("meta_client_geo_autonomous_system_number", UInt32SliceToInterface(filter.In.Values)) + } + case *NullableUInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("meta_client_geo_autonomous_system_number", UInt32SliceToInterface(filter.NotIn.Values)) + } + case *NullableUInt32Filter_IsNull: + qb.AddIsNullCondition("meta_client_geo_autonomous_system_number") + case *NullableUInt32Filter_IsNotNull: + qb.AddIsNotNullCondition("meta_client_geo_autonomous_system_number") + default: + // Unsupported filter type + } + } + + // Add filter for column: meta_client_geo_autonomous_system_organization + if req.MetaClientGeoAutonomousSystemOrganization != nil { + switch filter := req.MetaClientGeoAutonomousSystemOrganization.Filter.(type) { + case *NullableStringFilter_Eq: + qb.AddCondition("meta_client_geo_autonomous_system_organization", "=", filter.Eq) + case *NullableStringFilter_Ne: + qb.AddCondition("meta_client_geo_autonomous_system_organization", "!=", filter.Ne) + case *NullableStringFilter_Contains: + qb.AddLikeCondition("meta_client_geo_autonomous_system_organization", "%" + filter.Contains + "%") + case *NullableStringFilter_StartsWith: + qb.AddLikeCondition("meta_client_geo_autonomous_system_organization", filter.StartsWith + "%") + case *NullableStringFilter_EndsWith: + qb.AddLikeCondition("meta_client_geo_autonomous_system_organization", "%" + filter.EndsWith) + case *NullableStringFilter_Like: + qb.AddLikeCondition("meta_client_geo_autonomous_system_organization", filter.Like) + case *NullableStringFilter_NotLike: + qb.AddNotLikeCondition("meta_client_geo_autonomous_system_organization", filter.NotLike) + case *NullableStringFilter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("meta_client_geo_autonomous_system_organization", StringSliceToInterface(filter.In.Values)) + } + case *NullableStringFilter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("meta_client_geo_autonomous_system_organization", StringSliceToInterface(filter.NotIn.Values)) + } + case *NullableStringFilter_IsNull: + qb.AddIsNullCondition("meta_client_geo_autonomous_system_organization") + case *NullableStringFilter_IsNotNull: + qb.AddIsNotNullCondition("meta_client_geo_autonomous_system_organization") + default: + // Unsupported filter type + } + } + + // Add filter for column: min_slot + if req.MinSlot != nil { + switch filter := req.MinSlot.Filter.(type) { + case *UInt64Filter_Eq: + qb.AddCondition("min_slot", "=", filter.Eq) + case *UInt64Filter_Ne: + qb.AddCondition("min_slot", "!=", filter.Ne) + case *UInt64Filter_Lt: + qb.AddCondition("min_slot", "<", filter.Lt) + case *UInt64Filter_Lte: + qb.AddCondition("min_slot", "<=", filter.Lte) + case *UInt64Filter_Gt: + qb.AddCondition("min_slot", ">", filter.Gt) + case *UInt64Filter_Gte: + qb.AddCondition("min_slot", ">=", filter.Gte) + case *UInt64Filter_Between: + qb.AddBetweenCondition("min_slot", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt64Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("min_slot", UInt64SliceToInterface(filter.In.Values)) + } + case *UInt64Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("min_slot", UInt64SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: max_slot + if req.MaxSlot != nil { + switch filter := req.MaxSlot.Filter.(type) { + case *UInt64Filter_Eq: + qb.AddCondition("max_slot", "=", filter.Eq) + case *UInt64Filter_Ne: + qb.AddCondition("max_slot", "!=", filter.Ne) + case *UInt64Filter_Lt: + qb.AddCondition("max_slot", "<", filter.Lt) + case *UInt64Filter_Lte: + qb.AddCondition("max_slot", "<=", filter.Lte) + case *UInt64Filter_Gt: + qb.AddCondition("max_slot", ">", filter.Gt) + case *UInt64Filter_Gte: + qb.AddCondition("max_slot", ">=", filter.Gte) + case *UInt64Filter_Between: + qb.AddBetweenCondition("max_slot", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt64Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("max_slot", UInt64SliceToInterface(filter.In.Values)) + } + case *UInt64Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("max_slot", UInt64SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: slot_count + if req.SlotCount != nil { + switch filter := req.SlotCount.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("slot_count", "=", filter.Eq) + case *UInt32Filter_Ne: + qb.AddCondition("slot_count", "!=", filter.Ne) + case *UInt32Filter_Lt: + qb.AddCondition("slot_count", "<", filter.Lt) + case *UInt32Filter_Lte: + qb.AddCondition("slot_count", "<=", filter.Lte) + case *UInt32Filter_Gt: + qb.AddCondition("slot_count", ">", filter.Gt) + case *UInt32Filter_Gte: + qb.AddCondition("slot_count", ">=", filter.Gte) + case *UInt32Filter_Between: + qb.AddBetweenCondition("slot_count", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("slot_count", UInt32SliceToInterface(filter.In.Values)) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("slot_count", UInt32SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: min_seen_slot_start_diff_ms + if req.MinSeenSlotStartDiffMs != nil { + switch filter := req.MinSeenSlotStartDiffMs.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("min_seen_slot_start_diff_ms", "=", filter.Eq) + case *UInt32Filter_Ne: + qb.AddCondition("min_seen_slot_start_diff_ms", "!=", filter.Ne) + case *UInt32Filter_Lt: + qb.AddCondition("min_seen_slot_start_diff_ms", "<", filter.Lt) + case *UInt32Filter_Lte: + qb.AddCondition("min_seen_slot_start_diff_ms", "<=", filter.Lte) + case *UInt32Filter_Gt: + qb.AddCondition("min_seen_slot_start_diff_ms", ">", filter.Gt) + case *UInt32Filter_Gte: + qb.AddCondition("min_seen_slot_start_diff_ms", ">=", filter.Gte) + case *UInt32Filter_Between: + qb.AddBetweenCondition("min_seen_slot_start_diff_ms", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("min_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.In.Values)) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("min_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: p05_seen_slot_start_diff_ms + if req.P05SeenSlotStartDiffMs != nil { + switch filter := req.P05SeenSlotStartDiffMs.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("p05_seen_slot_start_diff_ms", "=", filter.Eq) + case *UInt32Filter_Ne: + qb.AddCondition("p05_seen_slot_start_diff_ms", "!=", filter.Ne) + case *UInt32Filter_Lt: + qb.AddCondition("p05_seen_slot_start_diff_ms", "<", filter.Lt) + case *UInt32Filter_Lte: + qb.AddCondition("p05_seen_slot_start_diff_ms", "<=", filter.Lte) + case *UInt32Filter_Gt: + qb.AddCondition("p05_seen_slot_start_diff_ms", ">", filter.Gt) + case *UInt32Filter_Gte: + qb.AddCondition("p05_seen_slot_start_diff_ms", ">=", filter.Gte) + case *UInt32Filter_Between: + qb.AddBetweenCondition("p05_seen_slot_start_diff_ms", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("p05_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.In.Values)) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("p05_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: p50_seen_slot_start_diff_ms + if req.P50SeenSlotStartDiffMs != nil { + switch filter := req.P50SeenSlotStartDiffMs.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("p50_seen_slot_start_diff_ms", "=", filter.Eq) + case *UInt32Filter_Ne: + qb.AddCondition("p50_seen_slot_start_diff_ms", "!=", filter.Ne) + case *UInt32Filter_Lt: + qb.AddCondition("p50_seen_slot_start_diff_ms", "<", filter.Lt) + case *UInt32Filter_Lte: + qb.AddCondition("p50_seen_slot_start_diff_ms", "<=", filter.Lte) + case *UInt32Filter_Gt: + qb.AddCondition("p50_seen_slot_start_diff_ms", ">", filter.Gt) + case *UInt32Filter_Gte: + qb.AddCondition("p50_seen_slot_start_diff_ms", ">=", filter.Gte) + case *UInt32Filter_Between: + qb.AddBetweenCondition("p50_seen_slot_start_diff_ms", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("p50_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.In.Values)) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("p50_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: avg_seen_slot_start_diff_ms + if req.AvgSeenSlotStartDiffMs != nil { + switch filter := req.AvgSeenSlotStartDiffMs.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("avg_seen_slot_start_diff_ms", "=", filter.Eq) + case *UInt32Filter_Ne: + qb.AddCondition("avg_seen_slot_start_diff_ms", "!=", filter.Ne) + case *UInt32Filter_Lt: + qb.AddCondition("avg_seen_slot_start_diff_ms", "<", filter.Lt) + case *UInt32Filter_Lte: + qb.AddCondition("avg_seen_slot_start_diff_ms", "<=", filter.Lte) + case *UInt32Filter_Gt: + qb.AddCondition("avg_seen_slot_start_diff_ms", ">", filter.Gt) + case *UInt32Filter_Gte: + qb.AddCondition("avg_seen_slot_start_diff_ms", ">=", filter.Gte) + case *UInt32Filter_Between: + qb.AddBetweenCondition("avg_seen_slot_start_diff_ms", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("avg_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.In.Values)) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("avg_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: p90_seen_slot_start_diff_ms + if req.P90SeenSlotStartDiffMs != nil { + switch filter := req.P90SeenSlotStartDiffMs.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("p90_seen_slot_start_diff_ms", "=", filter.Eq) + case *UInt32Filter_Ne: + qb.AddCondition("p90_seen_slot_start_diff_ms", "!=", filter.Ne) + case *UInt32Filter_Lt: + qb.AddCondition("p90_seen_slot_start_diff_ms", "<", filter.Lt) + case *UInt32Filter_Lte: + qb.AddCondition("p90_seen_slot_start_diff_ms", "<=", filter.Lte) + case *UInt32Filter_Gt: + qb.AddCondition("p90_seen_slot_start_diff_ms", ">", filter.Gt) + case *UInt32Filter_Gte: + qb.AddCondition("p90_seen_slot_start_diff_ms", ">=", filter.Gte) + case *UInt32Filter_Between: + qb.AddBetweenCondition("p90_seen_slot_start_diff_ms", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("p90_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.In.Values)) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("p90_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: p95_seen_slot_start_diff_ms + if req.P95SeenSlotStartDiffMs != nil { + switch filter := req.P95SeenSlotStartDiffMs.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("p95_seen_slot_start_diff_ms", "=", filter.Eq) + case *UInt32Filter_Ne: + qb.AddCondition("p95_seen_slot_start_diff_ms", "!=", filter.Ne) + case *UInt32Filter_Lt: + qb.AddCondition("p95_seen_slot_start_diff_ms", "<", filter.Lt) + case *UInt32Filter_Lte: + qb.AddCondition("p95_seen_slot_start_diff_ms", "<=", filter.Lte) + case *UInt32Filter_Gt: + qb.AddCondition("p95_seen_slot_start_diff_ms", ">", filter.Gt) + case *UInt32Filter_Gte: + qb.AddCondition("p95_seen_slot_start_diff_ms", ">=", filter.Gte) + case *UInt32Filter_Between: + qb.AddBetweenCondition("p95_seen_slot_start_diff_ms", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("p95_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.In.Values)) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("p95_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: p99_seen_slot_start_diff_ms + if req.P99SeenSlotStartDiffMs != nil { + switch filter := req.P99SeenSlotStartDiffMs.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("p99_seen_slot_start_diff_ms", "=", filter.Eq) + case *UInt32Filter_Ne: + qb.AddCondition("p99_seen_slot_start_diff_ms", "!=", filter.Ne) + case *UInt32Filter_Lt: + qb.AddCondition("p99_seen_slot_start_diff_ms", "<", filter.Lt) + case *UInt32Filter_Lte: + qb.AddCondition("p99_seen_slot_start_diff_ms", "<=", filter.Lte) + case *UInt32Filter_Gt: + qb.AddCondition("p99_seen_slot_start_diff_ms", ">", filter.Gt) + case *UInt32Filter_Gte: + qb.AddCondition("p99_seen_slot_start_diff_ms", ">=", filter.Gte) + case *UInt32Filter_Between: + qb.AddBetweenCondition("p99_seen_slot_start_diff_ms", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("p99_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.In.Values)) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("p99_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: max_seen_slot_start_diff_ms + if req.MaxSeenSlotStartDiffMs != nil { + switch filter := req.MaxSeenSlotStartDiffMs.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("max_seen_slot_start_diff_ms", "=", filter.Eq) + case *UInt32Filter_Ne: + qb.AddCondition("max_seen_slot_start_diff_ms", "!=", filter.Ne) + case *UInt32Filter_Lt: + qb.AddCondition("max_seen_slot_start_diff_ms", "<", filter.Lt) + case *UInt32Filter_Lte: + qb.AddCondition("max_seen_slot_start_diff_ms", "<=", filter.Lte) + case *UInt32Filter_Gt: + qb.AddCondition("max_seen_slot_start_diff_ms", ">", filter.Gt) + case *UInt32Filter_Gte: + qb.AddCondition("max_seen_slot_start_diff_ms", ">=", filter.Gte) + case *UInt32Filter_Between: + qb.AddBetweenCondition("max_seen_slot_start_diff_ms", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("max_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.In.Values)) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("max_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Handle pagination per AIP-132 + // Validate page size + if req.PageSize < 0 { + return SQLQuery{}, fmt.Errorf("page_size must be non-negative, got %d", req.PageSize) + } + if req.PageSize > 10000 { + return SQLQuery{}, fmt.Errorf("page_size must not exceed %d, got %d", 10000, req.PageSize) + } + + var limit, offset uint32 + limit = 100 // Default page size + if req.PageSize > 0 { + limit = uint32(req.PageSize) + } + if req.PageToken != "" { + decodedOffset, err := DecodePageToken(req.PageToken) + if err != nil { + return SQLQuery{}, fmt.Errorf("invalid page_token: %w", err) + } + offset = decodedOffset + } + + // Handle custom ordering if provided + var orderByClause string + if req.OrderBy != "" { + validFields := []string{"updated_date_time", "epoch", "epoch_start_date_time", "username", "node_id", "classification", "meta_client_name", "meta_client_implementation", "meta_client_geo_city", "meta_client_geo_country", "meta_client_geo_country_code", "meta_client_geo_continent_code", "meta_client_geo_longitude", "meta_client_geo_latitude", "meta_client_geo_autonomous_system_number", "meta_client_geo_autonomous_system_organization", "min_slot", "max_slot", "slot_count", "min_seen_slot_start_diff_ms", "p05_seen_slot_start_diff_ms", "p50_seen_slot_start_diff_ms", "avg_seen_slot_start_diff_ms", "p90_seen_slot_start_diff_ms", "p95_seen_slot_start_diff_ms", "p99_seen_slot_start_diff_ms", "max_seen_slot_start_diff_ms"} + orderFields, err := ParseOrderBy(req.OrderBy, validFields) + if err != nil { + return SQLQuery{}, fmt.Errorf("invalid order_by: %w", err) + } + orderByClause = BuildOrderByClause(orderFields) + } else { + // Default sorting by primary key + orderByClause = " ORDER BY epoch_start_date_time" + ", meta_client_name" + } + + // Build column list + columns := []string{"toUnixTimestamp(`updated_date_time`) AS `updated_date_time`", "epoch", "toUnixTimestamp(`epoch_start_date_time`) AS `epoch_start_date_time`", "username", "node_id", "classification", "meta_client_name", "meta_client_implementation", "meta_client_geo_city", "meta_client_geo_country", "meta_client_geo_country_code", "meta_client_geo_continent_code", "meta_client_geo_longitude", "meta_client_geo_latitude", "meta_client_geo_autonomous_system_number", "meta_client_geo_autonomous_system_organization", "min_slot", "max_slot", "slot_count", "min_seen_slot_start_diff_ms", "p05_seen_slot_start_diff_ms", "p50_seen_slot_start_diff_ms", "avg_seen_slot_start_diff_ms", "p90_seen_slot_start_diff_ms", "p95_seen_slot_start_diff_ms", "p99_seen_slot_start_diff_ms", "max_seen_slot_start_diff_ms"} + + return BuildParameterizedQuery("fct_block_first_seen_by_node_by_epoch", columns, qb, orderByClause, limit, offset, options...) +} + +// BuildGetFctBlockFirstSeenByNodeByEpochQuery constructs a parameterized SQL query from a GetFctBlockFirstSeenByNodeByEpochRequest +func BuildGetFctBlockFirstSeenByNodeByEpochQuery(req *GetFctBlockFirstSeenByNodeByEpochRequest, options ...QueryOption) (SQLQuery, error) { + // Validate primary key is provided + if req.EpochStartDateTime == 0 { + return SQLQuery{}, fmt.Errorf("primary key field epoch_start_date_time is required") + } + + // Build query with primary key condition + qb := NewQueryBuilder() + qb.AddCondition("epoch_start_date_time", "=", req.EpochStartDateTime) + + // Build ORDER BY clause + orderByClause := " ORDER BY epoch_start_date_time, meta_client_name" + + // Build column list + columns := []string{"toUnixTimestamp(`updated_date_time`) AS `updated_date_time`", "epoch", "toUnixTimestamp(`epoch_start_date_time`) AS `epoch_start_date_time`", "username", "node_id", "classification", "meta_client_name", "meta_client_implementation", "meta_client_geo_city", "meta_client_geo_country", "meta_client_geo_country_code", "meta_client_geo_continent_code", "meta_client_geo_longitude", "meta_client_geo_latitude", "meta_client_geo_autonomous_system_number", "meta_client_geo_autonomous_system_organization", "min_slot", "max_slot", "slot_count", "min_seen_slot_start_diff_ms", "p05_seen_slot_start_diff_ms", "p50_seen_slot_start_diff_ms", "avg_seen_slot_start_diff_ms", "p90_seen_slot_start_diff_ms", "p95_seen_slot_start_diff_ms", "p99_seen_slot_start_diff_ms", "max_seen_slot_start_diff_ms"} + + // Return single record + return BuildParameterizedQuery("fct_block_first_seen_by_node_by_epoch", columns, qb, orderByClause, 1, 0, options...) +} diff --git a/pkg/proto/clickhouse/fct_block_first_seen_by_node_by_epoch.pb.go b/pkg/proto/clickhouse/fct_block_first_seen_by_node_by_epoch.pb.go new file mode 100644 index 00000000..b25b64e3 --- /dev/null +++ b/pkg/proto/clickhouse/fct_block_first_seen_by_node_by_epoch.pb.go @@ -0,0 +1,1253 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.34.2 +// protoc (unknown) +// source: fct_block_first_seen_by_node_by_epoch.proto + +package clickhouse + +import ( + _ "github.com/ethpandaops/xatu-cbt/pkg/proto/clickhouse/clickhouse" + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + wrapperspb "google.golang.org/protobuf/types/known/wrapperspb" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type FctBlockFirstSeenByNodeByEpoch struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Timestamp when the record was last updated + UpdatedDateTime uint32 `protobuf:"varint,11,opt,name=updated_date_time,json=updatedDateTime,proto3" json:"updated_date_time,omitempty"` + // Epoch number + Epoch uint32 `protobuf:"varint,12,opt,name=epoch,proto3" json:"epoch,omitempty"` + // The wall clock time when the epoch started + EpochStartDateTime uint32 `protobuf:"varint,13,opt,name=epoch_start_date_time,json=epochStartDateTime,proto3" json:"epoch_start_date_time,omitempty"` + // Username of the node + Username string `protobuf:"bytes,14,opt,name=username,proto3" json:"username,omitempty"` + // ID of the node + NodeId string `protobuf:"bytes,15,opt,name=node_id,json=nodeId,proto3" json:"node_id,omitempty"` + // Classification of the node, e.g. "individual", "corporate", "internal" (aka ethPandaOps) or "unclassified" + Classification string `protobuf:"bytes,16,opt,name=classification,proto3" json:"classification,omitempty"` + // Name of the client + MetaClientName string `protobuf:"bytes,17,opt,name=meta_client_name,json=metaClientName,proto3" json:"meta_client_name,omitempty"` + // Implementation of the client + MetaClientImplementation string `protobuf:"bytes,18,opt,name=meta_client_implementation,json=metaClientImplementation,proto3" json:"meta_client_implementation,omitempty"` + // City of the client + MetaClientGeoCity string `protobuf:"bytes,19,opt,name=meta_client_geo_city,json=metaClientGeoCity,proto3" json:"meta_client_geo_city,omitempty"` + // Country of the client + MetaClientGeoCountry string `protobuf:"bytes,20,opt,name=meta_client_geo_country,json=metaClientGeoCountry,proto3" json:"meta_client_geo_country,omitempty"` + // Country code of the client + MetaClientGeoCountryCode string `protobuf:"bytes,21,opt,name=meta_client_geo_country_code,json=metaClientGeoCountryCode,proto3" json:"meta_client_geo_country_code,omitempty"` + // Continent code of the client + MetaClientGeoContinentCode string `protobuf:"bytes,22,opt,name=meta_client_geo_continent_code,json=metaClientGeoContinentCode,proto3" json:"meta_client_geo_continent_code,omitempty"` + // Longitude of the client + MetaClientGeoLongitude *wrapperspb.DoubleValue `protobuf:"bytes,23,opt,name=meta_client_geo_longitude,json=metaClientGeoLongitude,proto3" json:"meta_client_geo_longitude,omitempty"` + // Latitude of the client + MetaClientGeoLatitude *wrapperspb.DoubleValue `protobuf:"bytes,24,opt,name=meta_client_geo_latitude,json=metaClientGeoLatitude,proto3" json:"meta_client_geo_latitude,omitempty"` + // Autonomous system number of the client + MetaClientGeoAutonomousSystemNumber *wrapperspb.UInt32Value `protobuf:"bytes,25,opt,name=meta_client_geo_autonomous_system_number,json=metaClientGeoAutonomousSystemNumber,proto3" json:"meta_client_geo_autonomous_system_number,omitempty"` + // Autonomous system organization of the client + MetaClientGeoAutonomousSystemOrganization *wrapperspb.StringValue `protobuf:"bytes,26,opt,name=meta_client_geo_autonomous_system_organization,json=metaClientGeoAutonomousSystemOrganization,proto3" json:"meta_client_geo_autonomous_system_organization,omitempty"` + // Minimum slot number in this epoch + MinSlot uint64 `protobuf:"varint,27,opt,name=min_slot,json=minSlot,proto3" json:"min_slot,omitempty"` + // Maximum slot number in this epoch + MaxSlot uint64 `protobuf:"varint,28,opt,name=max_slot,json=maxSlot,proto3" json:"max_slot,omitempty"` + // Number of slots with blocks seen in this epoch + SlotCount uint32 `protobuf:"varint,29,opt,name=slot_count,json=slotCount,proto3" json:"slot_count,omitempty"` + // Minimum time from slot start for the node to see a block (milliseconds) + MinSeenSlotStartDiffMs uint32 `protobuf:"varint,30,opt,name=min_seen_slot_start_diff_ms,json=minSeenSlotStartDiffMs,proto3" json:"min_seen_slot_start_diff_ms,omitempty"` + // 5th percentile time from slot start (milliseconds) + P05SeenSlotStartDiffMs uint32 `protobuf:"varint,31,opt,name=p05_seen_slot_start_diff_ms,json=p05SeenSlotStartDiffMs,proto3" json:"p05_seen_slot_start_diff_ms,omitempty"` + // Median (p50) time from slot start (milliseconds) + P50SeenSlotStartDiffMs uint32 `protobuf:"varint,32,opt,name=p50_seen_slot_start_diff_ms,json=p50SeenSlotStartDiffMs,proto3" json:"p50_seen_slot_start_diff_ms,omitempty"` + // Average time from slot start (milliseconds) + AvgSeenSlotStartDiffMs uint32 `protobuf:"varint,33,opt,name=avg_seen_slot_start_diff_ms,json=avgSeenSlotStartDiffMs,proto3" json:"avg_seen_slot_start_diff_ms,omitempty"` + // 90th percentile time from slot start (milliseconds) + P90SeenSlotStartDiffMs uint32 `protobuf:"varint,34,opt,name=p90_seen_slot_start_diff_ms,json=p90SeenSlotStartDiffMs,proto3" json:"p90_seen_slot_start_diff_ms,omitempty"` + // 95th percentile time from slot start (milliseconds) + P95SeenSlotStartDiffMs uint32 `protobuf:"varint,35,opt,name=p95_seen_slot_start_diff_ms,json=p95SeenSlotStartDiffMs,proto3" json:"p95_seen_slot_start_diff_ms,omitempty"` + // 99th percentile time from slot start (milliseconds) + P99SeenSlotStartDiffMs uint32 `protobuf:"varint,36,opt,name=p99_seen_slot_start_diff_ms,json=p99SeenSlotStartDiffMs,proto3" json:"p99_seen_slot_start_diff_ms,omitempty"` + // Maximum time from slot start (milliseconds) + MaxSeenSlotStartDiffMs uint32 `protobuf:"varint,37,opt,name=max_seen_slot_start_diff_ms,json=maxSeenSlotStartDiffMs,proto3" json:"max_seen_slot_start_diff_ms,omitempty"` +} + +func (x *FctBlockFirstSeenByNodeByEpoch) Reset() { + *x = FctBlockFirstSeenByNodeByEpoch{} + if protoimpl.UnsafeEnabled { + mi := &file_fct_block_first_seen_by_node_by_epoch_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FctBlockFirstSeenByNodeByEpoch) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FctBlockFirstSeenByNodeByEpoch) ProtoMessage() {} + +func (x *FctBlockFirstSeenByNodeByEpoch) ProtoReflect() protoreflect.Message { + mi := &file_fct_block_first_seen_by_node_by_epoch_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FctBlockFirstSeenByNodeByEpoch.ProtoReflect.Descriptor instead. +func (*FctBlockFirstSeenByNodeByEpoch) Descriptor() ([]byte, []int) { + return file_fct_block_first_seen_by_node_by_epoch_proto_rawDescGZIP(), []int{0} +} + +func (x *FctBlockFirstSeenByNodeByEpoch) GetUpdatedDateTime() uint32 { + if x != nil { + return x.UpdatedDateTime + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeByEpoch) GetEpoch() uint32 { + if x != nil { + return x.Epoch + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeByEpoch) GetEpochStartDateTime() uint32 { + if x != nil { + return x.EpochStartDateTime + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeByEpoch) GetUsername() string { + if x != nil { + return x.Username + } + return "" +} + +func (x *FctBlockFirstSeenByNodeByEpoch) GetNodeId() string { + if x != nil { + return x.NodeId + } + return "" +} + +func (x *FctBlockFirstSeenByNodeByEpoch) GetClassification() string { + if x != nil { + return x.Classification + } + return "" +} + +func (x *FctBlockFirstSeenByNodeByEpoch) GetMetaClientName() string { + if x != nil { + return x.MetaClientName + } + return "" +} + +func (x *FctBlockFirstSeenByNodeByEpoch) GetMetaClientImplementation() string { + if x != nil { + return x.MetaClientImplementation + } + return "" +} + +func (x *FctBlockFirstSeenByNodeByEpoch) GetMetaClientGeoCity() string { + if x != nil { + return x.MetaClientGeoCity + } + return "" +} + +func (x *FctBlockFirstSeenByNodeByEpoch) GetMetaClientGeoCountry() string { + if x != nil { + return x.MetaClientGeoCountry + } + return "" +} + +func (x *FctBlockFirstSeenByNodeByEpoch) GetMetaClientGeoCountryCode() string { + if x != nil { + return x.MetaClientGeoCountryCode + } + return "" +} + +func (x *FctBlockFirstSeenByNodeByEpoch) GetMetaClientGeoContinentCode() string { + if x != nil { + return x.MetaClientGeoContinentCode + } + return "" +} + +func (x *FctBlockFirstSeenByNodeByEpoch) GetMetaClientGeoLongitude() *wrapperspb.DoubleValue { + if x != nil { + return x.MetaClientGeoLongitude + } + return nil +} + +func (x *FctBlockFirstSeenByNodeByEpoch) GetMetaClientGeoLatitude() *wrapperspb.DoubleValue { + if x != nil { + return x.MetaClientGeoLatitude + } + return nil +} + +func (x *FctBlockFirstSeenByNodeByEpoch) GetMetaClientGeoAutonomousSystemNumber() *wrapperspb.UInt32Value { + if x != nil { + return x.MetaClientGeoAutonomousSystemNumber + } + return nil +} + +func (x *FctBlockFirstSeenByNodeByEpoch) GetMetaClientGeoAutonomousSystemOrganization() *wrapperspb.StringValue { + if x != nil { + return x.MetaClientGeoAutonomousSystemOrganization + } + return nil +} + +func (x *FctBlockFirstSeenByNodeByEpoch) GetMinSlot() uint64 { + if x != nil { + return x.MinSlot + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeByEpoch) GetMaxSlot() uint64 { + if x != nil { + return x.MaxSlot + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeByEpoch) GetSlotCount() uint32 { + if x != nil { + return x.SlotCount + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeByEpoch) GetMinSeenSlotStartDiffMs() uint32 { + if x != nil { + return x.MinSeenSlotStartDiffMs + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeByEpoch) GetP05SeenSlotStartDiffMs() uint32 { + if x != nil { + return x.P05SeenSlotStartDiffMs + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeByEpoch) GetP50SeenSlotStartDiffMs() uint32 { + if x != nil { + return x.P50SeenSlotStartDiffMs + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeByEpoch) GetAvgSeenSlotStartDiffMs() uint32 { + if x != nil { + return x.AvgSeenSlotStartDiffMs + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeByEpoch) GetP90SeenSlotStartDiffMs() uint32 { + if x != nil { + return x.P90SeenSlotStartDiffMs + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeByEpoch) GetP95SeenSlotStartDiffMs() uint32 { + if x != nil { + return x.P95SeenSlotStartDiffMs + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeByEpoch) GetP99SeenSlotStartDiffMs() uint32 { + if x != nil { + return x.P99SeenSlotStartDiffMs + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeByEpoch) GetMaxSeenSlotStartDiffMs() uint32 { + if x != nil { + return x.MaxSeenSlotStartDiffMs + } + return 0 +} + +// Request for listing fct_block_first_seen_by_node_by_epoch records +type ListFctBlockFirstSeenByNodeByEpochRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Filter by epoch_start_date_time - The wall clock time when the epoch started (PRIMARY KEY - required unless using alternatives: epoch) + EpochStartDateTime *UInt32Filter `protobuf:"bytes,1,opt,name=epoch_start_date_time,json=epochStartDateTime,proto3" json:"epoch_start_date_time,omitempty"` + // Filter by meta_client_name - Name of the client (ORDER BY column 2 - optional) + MetaClientName *StringFilter `protobuf:"bytes,2,opt,name=meta_client_name,json=metaClientName,proto3" json:"meta_client_name,omitempty"` + // Filter by updated_date_time - Timestamp when the record was last updated (optional) + UpdatedDateTime *UInt32Filter `protobuf:"bytes,3,opt,name=updated_date_time,json=updatedDateTime,proto3" json:"updated_date_time,omitempty"` + // Filter by epoch - Epoch number (PROJECTION: p_by_epoch_node - alternative to epoch_start_date_time) + Epoch *UInt32Filter `protobuf:"bytes,4,opt,name=epoch,proto3" json:"epoch,omitempty"` + // Filter by username - Username of the node (optional) + Username *StringFilter `protobuf:"bytes,5,opt,name=username,proto3" json:"username,omitempty"` + // Filter by node_id - ID of the node (optional) + NodeId *StringFilter `protobuf:"bytes,6,opt,name=node_id,json=nodeId,proto3" json:"node_id,omitempty"` + // Filter by classification - Classification of the node, e.g. "individual", "corporate", "internal" (aka ethPandaOps) or "unclassified" (optional) + Classification *StringFilter `protobuf:"bytes,7,opt,name=classification,proto3" json:"classification,omitempty"` + // Filter by meta_client_implementation - Implementation of the client (optional) + MetaClientImplementation *StringFilter `protobuf:"bytes,8,opt,name=meta_client_implementation,json=metaClientImplementation,proto3" json:"meta_client_implementation,omitempty"` + // Filter by meta_client_geo_city - City of the client (optional) + MetaClientGeoCity *StringFilter `protobuf:"bytes,9,opt,name=meta_client_geo_city,json=metaClientGeoCity,proto3" json:"meta_client_geo_city,omitempty"` + // Filter by meta_client_geo_country - Country of the client (optional) + MetaClientGeoCountry *StringFilter `protobuf:"bytes,10,opt,name=meta_client_geo_country,json=metaClientGeoCountry,proto3" json:"meta_client_geo_country,omitempty"` + // Filter by meta_client_geo_country_code - Country code of the client (optional) + MetaClientGeoCountryCode *StringFilter `protobuf:"bytes,11,opt,name=meta_client_geo_country_code,json=metaClientGeoCountryCode,proto3" json:"meta_client_geo_country_code,omitempty"` + // Filter by meta_client_geo_continent_code - Continent code of the client (optional) + MetaClientGeoContinentCode *StringFilter `protobuf:"bytes,12,opt,name=meta_client_geo_continent_code,json=metaClientGeoContinentCode,proto3" json:"meta_client_geo_continent_code,omitempty"` + // Filter by meta_client_geo_longitude - Longitude of the client (optional) + MetaClientGeoLongitude *wrapperspb.DoubleValue `protobuf:"bytes,13,opt,name=meta_client_geo_longitude,json=metaClientGeoLongitude,proto3" json:"meta_client_geo_longitude,omitempty"` + // Filter by meta_client_geo_latitude - Latitude of the client (optional) + MetaClientGeoLatitude *wrapperspb.DoubleValue `protobuf:"bytes,14,opt,name=meta_client_geo_latitude,json=metaClientGeoLatitude,proto3" json:"meta_client_geo_latitude,omitempty"` + // Filter by meta_client_geo_autonomous_system_number - Autonomous system number of the client (optional) + MetaClientGeoAutonomousSystemNumber *NullableUInt32Filter `protobuf:"bytes,15,opt,name=meta_client_geo_autonomous_system_number,json=metaClientGeoAutonomousSystemNumber,proto3" json:"meta_client_geo_autonomous_system_number,omitempty"` + // Filter by meta_client_geo_autonomous_system_organization - Autonomous system organization of the client (optional) + MetaClientGeoAutonomousSystemOrganization *NullableStringFilter `protobuf:"bytes,16,opt,name=meta_client_geo_autonomous_system_organization,json=metaClientGeoAutonomousSystemOrganization,proto3" json:"meta_client_geo_autonomous_system_organization,omitempty"` + // Filter by min_slot - Minimum slot number in this epoch (optional) + MinSlot *UInt64Filter `protobuf:"bytes,17,opt,name=min_slot,json=minSlot,proto3" json:"min_slot,omitempty"` + // Filter by max_slot - Maximum slot number in this epoch (optional) + MaxSlot *UInt64Filter `protobuf:"bytes,18,opt,name=max_slot,json=maxSlot,proto3" json:"max_slot,omitempty"` + // Filter by slot_count - Number of slots with blocks seen in this epoch (optional) + SlotCount *UInt32Filter `protobuf:"bytes,19,opt,name=slot_count,json=slotCount,proto3" json:"slot_count,omitempty"` + // Filter by min_seen_slot_start_diff_ms - Minimum time from slot start for the node to see a block (milliseconds) (optional) + MinSeenSlotStartDiffMs *UInt32Filter `protobuf:"bytes,20,opt,name=min_seen_slot_start_diff_ms,json=minSeenSlotStartDiffMs,proto3" json:"min_seen_slot_start_diff_ms,omitempty"` + // Filter by p05_seen_slot_start_diff_ms - 5th percentile time from slot start (milliseconds) (optional) + P05SeenSlotStartDiffMs *UInt32Filter `protobuf:"bytes,21,opt,name=p05_seen_slot_start_diff_ms,json=p05SeenSlotStartDiffMs,proto3" json:"p05_seen_slot_start_diff_ms,omitempty"` + // Filter by p50_seen_slot_start_diff_ms - Median (p50) time from slot start (milliseconds) (optional) + P50SeenSlotStartDiffMs *UInt32Filter `protobuf:"bytes,22,opt,name=p50_seen_slot_start_diff_ms,json=p50SeenSlotStartDiffMs,proto3" json:"p50_seen_slot_start_diff_ms,omitempty"` + // Filter by avg_seen_slot_start_diff_ms - Average time from slot start (milliseconds) (optional) + AvgSeenSlotStartDiffMs *UInt32Filter `protobuf:"bytes,23,opt,name=avg_seen_slot_start_diff_ms,json=avgSeenSlotStartDiffMs,proto3" json:"avg_seen_slot_start_diff_ms,omitempty"` + // Filter by p90_seen_slot_start_diff_ms - 90th percentile time from slot start (milliseconds) (optional) + P90SeenSlotStartDiffMs *UInt32Filter `protobuf:"bytes,24,opt,name=p90_seen_slot_start_diff_ms,json=p90SeenSlotStartDiffMs,proto3" json:"p90_seen_slot_start_diff_ms,omitempty"` + // Filter by p95_seen_slot_start_diff_ms - 95th percentile time from slot start (milliseconds) (optional) + P95SeenSlotStartDiffMs *UInt32Filter `protobuf:"bytes,25,opt,name=p95_seen_slot_start_diff_ms,json=p95SeenSlotStartDiffMs,proto3" json:"p95_seen_slot_start_diff_ms,omitempty"` + // Filter by p99_seen_slot_start_diff_ms - 99th percentile time from slot start (milliseconds) (optional) + P99SeenSlotStartDiffMs *UInt32Filter `protobuf:"bytes,26,opt,name=p99_seen_slot_start_diff_ms,json=p99SeenSlotStartDiffMs,proto3" json:"p99_seen_slot_start_diff_ms,omitempty"` + // Filter by max_seen_slot_start_diff_ms - Maximum time from slot start (milliseconds) (optional) + MaxSeenSlotStartDiffMs *UInt32Filter `protobuf:"bytes,27,opt,name=max_seen_slot_start_diff_ms,json=maxSeenSlotStartDiffMs,proto3" json:"max_seen_slot_start_diff_ms,omitempty"` + // The maximum number of fct_block_first_seen_by_node_by_epoch to return. + // If unspecified, at most 100 items will be returned. + // The maximum value is 10000; values above 10000 will be coerced to 10000. + PageSize int32 `protobuf:"varint,28,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + // A page token, received from a previous `ListFctBlockFirstSeenByNodeByEpoch` call. + // Provide this to retrieve the subsequent page. + PageToken string `protobuf:"bytes,29,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + // The order of results. Format: comma-separated list of fields. + // Example: "foo,bar" or "foo desc,bar" for descending order on foo. + // If unspecified, results will be returned in the default order. + OrderBy string `protobuf:"bytes,30,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"` +} + +func (x *ListFctBlockFirstSeenByNodeByEpochRequest) Reset() { + *x = ListFctBlockFirstSeenByNodeByEpochRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_fct_block_first_seen_by_node_by_epoch_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListFctBlockFirstSeenByNodeByEpochRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListFctBlockFirstSeenByNodeByEpochRequest) ProtoMessage() {} + +func (x *ListFctBlockFirstSeenByNodeByEpochRequest) ProtoReflect() protoreflect.Message { + mi := &file_fct_block_first_seen_by_node_by_epoch_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListFctBlockFirstSeenByNodeByEpochRequest.ProtoReflect.Descriptor instead. +func (*ListFctBlockFirstSeenByNodeByEpochRequest) Descriptor() ([]byte, []int) { + return file_fct_block_first_seen_by_node_by_epoch_proto_rawDescGZIP(), []int{1} +} + +func (x *ListFctBlockFirstSeenByNodeByEpochRequest) GetEpochStartDateTime() *UInt32Filter { + if x != nil { + return x.EpochStartDateTime + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeByEpochRequest) GetMetaClientName() *StringFilter { + if x != nil { + return x.MetaClientName + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeByEpochRequest) GetUpdatedDateTime() *UInt32Filter { + if x != nil { + return x.UpdatedDateTime + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeByEpochRequest) GetEpoch() *UInt32Filter { + if x != nil { + return x.Epoch + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeByEpochRequest) GetUsername() *StringFilter { + if x != nil { + return x.Username + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeByEpochRequest) GetNodeId() *StringFilter { + if x != nil { + return x.NodeId + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeByEpochRequest) GetClassification() *StringFilter { + if x != nil { + return x.Classification + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeByEpochRequest) GetMetaClientImplementation() *StringFilter { + if x != nil { + return x.MetaClientImplementation + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeByEpochRequest) GetMetaClientGeoCity() *StringFilter { + if x != nil { + return x.MetaClientGeoCity + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeByEpochRequest) GetMetaClientGeoCountry() *StringFilter { + if x != nil { + return x.MetaClientGeoCountry + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeByEpochRequest) GetMetaClientGeoCountryCode() *StringFilter { + if x != nil { + return x.MetaClientGeoCountryCode + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeByEpochRequest) GetMetaClientGeoContinentCode() *StringFilter { + if x != nil { + return x.MetaClientGeoContinentCode + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeByEpochRequest) GetMetaClientGeoLongitude() *wrapperspb.DoubleValue { + if x != nil { + return x.MetaClientGeoLongitude + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeByEpochRequest) GetMetaClientGeoLatitude() *wrapperspb.DoubleValue { + if x != nil { + return x.MetaClientGeoLatitude + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeByEpochRequest) GetMetaClientGeoAutonomousSystemNumber() *NullableUInt32Filter { + if x != nil { + return x.MetaClientGeoAutonomousSystemNumber + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeByEpochRequest) GetMetaClientGeoAutonomousSystemOrganization() *NullableStringFilter { + if x != nil { + return x.MetaClientGeoAutonomousSystemOrganization + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeByEpochRequest) GetMinSlot() *UInt64Filter { + if x != nil { + return x.MinSlot + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeByEpochRequest) GetMaxSlot() *UInt64Filter { + if x != nil { + return x.MaxSlot + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeByEpochRequest) GetSlotCount() *UInt32Filter { + if x != nil { + return x.SlotCount + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeByEpochRequest) GetMinSeenSlotStartDiffMs() *UInt32Filter { + if x != nil { + return x.MinSeenSlotStartDiffMs + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeByEpochRequest) GetP05SeenSlotStartDiffMs() *UInt32Filter { + if x != nil { + return x.P05SeenSlotStartDiffMs + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeByEpochRequest) GetP50SeenSlotStartDiffMs() *UInt32Filter { + if x != nil { + return x.P50SeenSlotStartDiffMs + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeByEpochRequest) GetAvgSeenSlotStartDiffMs() *UInt32Filter { + if x != nil { + return x.AvgSeenSlotStartDiffMs + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeByEpochRequest) GetP90SeenSlotStartDiffMs() *UInt32Filter { + if x != nil { + return x.P90SeenSlotStartDiffMs + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeByEpochRequest) GetP95SeenSlotStartDiffMs() *UInt32Filter { + if x != nil { + return x.P95SeenSlotStartDiffMs + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeByEpochRequest) GetP99SeenSlotStartDiffMs() *UInt32Filter { + if x != nil { + return x.P99SeenSlotStartDiffMs + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeByEpochRequest) GetMaxSeenSlotStartDiffMs() *UInt32Filter { + if x != nil { + return x.MaxSeenSlotStartDiffMs + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeByEpochRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListFctBlockFirstSeenByNodeByEpochRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +func (x *ListFctBlockFirstSeenByNodeByEpochRequest) GetOrderBy() string { + if x != nil { + return x.OrderBy + } + return "" +} + +// Response for listing fct_block_first_seen_by_node_by_epoch records +type ListFctBlockFirstSeenByNodeByEpochResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The list of fct_block_first_seen_by_node_by_epoch. + FctBlockFirstSeenByNodeByEpoch []*FctBlockFirstSeenByNodeByEpoch `protobuf:"bytes,1,rep,name=fct_block_first_seen_by_node_by_epoch,json=fctBlockFirstSeenByNodeByEpoch,proto3" json:"fct_block_first_seen_by_node_by_epoch,omitempty"` + // A token, which can be sent as `page_token` to retrieve the next page. + // If this field is omitted, there are no subsequent pages. + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` +} + +func (x *ListFctBlockFirstSeenByNodeByEpochResponse) Reset() { + *x = ListFctBlockFirstSeenByNodeByEpochResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_fct_block_first_seen_by_node_by_epoch_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListFctBlockFirstSeenByNodeByEpochResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListFctBlockFirstSeenByNodeByEpochResponse) ProtoMessage() {} + +func (x *ListFctBlockFirstSeenByNodeByEpochResponse) ProtoReflect() protoreflect.Message { + mi := &file_fct_block_first_seen_by_node_by_epoch_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListFctBlockFirstSeenByNodeByEpochResponse.ProtoReflect.Descriptor instead. +func (*ListFctBlockFirstSeenByNodeByEpochResponse) Descriptor() ([]byte, []int) { + return file_fct_block_first_seen_by_node_by_epoch_proto_rawDescGZIP(), []int{2} +} + +func (x *ListFctBlockFirstSeenByNodeByEpochResponse) GetFctBlockFirstSeenByNodeByEpoch() []*FctBlockFirstSeenByNodeByEpoch { + if x != nil { + return x.FctBlockFirstSeenByNodeByEpoch + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeByEpochResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +// Request for getting a single fct_block_first_seen_by_node_by_epoch record by primary key +type GetFctBlockFirstSeenByNodeByEpochRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The wall clock time when the epoch started + EpochStartDateTime uint32 `protobuf:"varint,1,opt,name=epoch_start_date_time,json=epochStartDateTime,proto3" json:"epoch_start_date_time,omitempty"` // Primary key (required) +} + +func (x *GetFctBlockFirstSeenByNodeByEpochRequest) Reset() { + *x = GetFctBlockFirstSeenByNodeByEpochRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_fct_block_first_seen_by_node_by_epoch_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetFctBlockFirstSeenByNodeByEpochRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetFctBlockFirstSeenByNodeByEpochRequest) ProtoMessage() {} + +func (x *GetFctBlockFirstSeenByNodeByEpochRequest) ProtoReflect() protoreflect.Message { + mi := &file_fct_block_first_seen_by_node_by_epoch_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetFctBlockFirstSeenByNodeByEpochRequest.ProtoReflect.Descriptor instead. +func (*GetFctBlockFirstSeenByNodeByEpochRequest) Descriptor() ([]byte, []int) { + return file_fct_block_first_seen_by_node_by_epoch_proto_rawDescGZIP(), []int{3} +} + +func (x *GetFctBlockFirstSeenByNodeByEpochRequest) GetEpochStartDateTime() uint32 { + if x != nil { + return x.EpochStartDateTime + } + return 0 +} + +// Response for getting a single fct_block_first_seen_by_node_by_epoch record +type GetFctBlockFirstSeenByNodeByEpochResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Item *FctBlockFirstSeenByNodeByEpoch `protobuf:"bytes,1,opt,name=item,proto3" json:"item,omitempty"` +} + +func (x *GetFctBlockFirstSeenByNodeByEpochResponse) Reset() { + *x = GetFctBlockFirstSeenByNodeByEpochResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_fct_block_first_seen_by_node_by_epoch_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetFctBlockFirstSeenByNodeByEpochResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetFctBlockFirstSeenByNodeByEpochResponse) ProtoMessage() {} + +func (x *GetFctBlockFirstSeenByNodeByEpochResponse) ProtoReflect() protoreflect.Message { + mi := &file_fct_block_first_seen_by_node_by_epoch_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetFctBlockFirstSeenByNodeByEpochResponse.ProtoReflect.Descriptor instead. +func (*GetFctBlockFirstSeenByNodeByEpochResponse) Descriptor() ([]byte, []int) { + return file_fct_block_first_seen_by_node_by_epoch_proto_rawDescGZIP(), []int{4} +} + +func (x *GetFctBlockFirstSeenByNodeByEpochResponse) GetItem() *FctBlockFirstSeenByNodeByEpoch { + if x != nil { + return x.Item + } + return nil +} + +var File_fct_block_first_seen_by_node_by_epoch_proto protoreflect.FileDescriptor + +var file_fct_block_first_seen_by_node_by_epoch_proto_rawDesc = []byte{ + 0x0a, 0x2b, 0x66, 0x63, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x66, 0x69, 0x72, 0x73, + 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x62, 0x79, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x62, + 0x79, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x03, 0x63, + 0x62, 0x74, 0x1a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, + 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, + 0x1c, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa9, 0x0c, + 0x0a, 0x1e, 0x46, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x72, 0x73, 0x74, 0x53, + 0x65, 0x65, 0x6e, 0x42, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x42, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, + 0x12, 0x2a, 0x0a, 0x11, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x65, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x44, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x65, 0x70, 0x6f, + 0x63, 0x68, 0x12, 0x31, 0x0a, 0x15, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x12, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x61, 0x74, + 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x0f, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6d, 0x65, + 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3c, 0x0a, 0x1a, + 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6d, 0x70, 0x6c, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x18, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6d, 0x70, 0x6c, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x14, 0x6d, 0x65, + 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x63, 0x69, + 0x74, 0x79, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x47, 0x65, 0x6f, 0x43, 0x69, 0x74, 0x79, 0x12, 0x35, 0x0a, 0x17, 0x6d, + 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x6d, 0x65, + 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x47, 0x65, 0x6f, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x3e, 0x0a, 0x1c, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x63, 0x6f, + 0x64, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x18, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x47, 0x65, 0x6f, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, + 0x64, 0x65, 0x12, 0x42, 0x0a, 0x1e, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x65, 0x6e, 0x74, 0x5f, + 0x63, 0x6f, 0x64, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1a, 0x6d, 0x65, 0x74, 0x61, + 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x47, 0x65, 0x6f, 0x43, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x65, + 0x6e, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x57, 0x0a, 0x19, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, + 0x75, 0x64, 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x6f, 0x75, 0x62, + 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x16, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x47, 0x65, 0x6f, 0x4c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, + 0x55, 0x0a, 0x18, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x67, + 0x65, 0x6f, 0x5f, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x18, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, + 0x15, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x47, 0x65, 0x6f, 0x4c, 0x61, + 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x73, 0x0a, 0x28, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x6e, 0x6f, + 0x6d, 0x6f, 0x75, 0x73, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, + 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x23, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x47, 0x65, 0x6f, 0x41, 0x75, 0x74, 0x6f, 0x6e, 0x6f, 0x6d, 0x6f, 0x75, 0x73, 0x53, + 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x7f, 0x0a, 0x2e, 0x6d, + 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x61, + 0x75, 0x74, 0x6f, 0x6e, 0x6f, 0x6d, 0x6f, 0x75, 0x73, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, + 0x5f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x1a, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x52, 0x29, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x47, 0x65, 0x6f, + 0x41, 0x75, 0x74, 0x6f, 0x6e, 0x6f, 0x6d, 0x6f, 0x75, 0x73, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, + 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, + 0x6d, 0x69, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, + 0x6d, 0x69, 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x73, + 0x6c, 0x6f, 0x74, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x53, 0x6c, + 0x6f, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x73, 0x6c, 0x6f, 0x74, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x3b, 0x0a, 0x1b, 0x6d, 0x69, 0x6e, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, 0x6c, + 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, + 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x16, 0x6d, 0x69, 0x6e, 0x53, 0x65, 0x65, 0x6e, 0x53, + 0x6c, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x69, 0x66, 0x66, 0x4d, 0x73, 0x12, 0x3b, + 0x0a, 0x1b, 0x70, 0x30, 0x35, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x1f, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x16, 0x70, 0x30, 0x35, 0x53, 0x65, 0x65, 0x6e, 0x53, 0x6c, 0x6f, 0x74, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x69, 0x66, 0x66, 0x4d, 0x73, 0x12, 0x3b, 0x0a, 0x1b, 0x70, + 0x35, 0x30, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x20, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x16, 0x70, 0x35, 0x30, 0x53, 0x65, 0x65, 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x44, 0x69, 0x66, 0x66, 0x4d, 0x73, 0x12, 0x3b, 0x0a, 0x1b, 0x61, 0x76, 0x67, 0x5f, + 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, + 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x21, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x16, 0x61, + 0x76, 0x67, 0x53, 0x65, 0x65, 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, + 0x69, 0x66, 0x66, 0x4d, 0x73, 0x12, 0x3b, 0x0a, 0x1b, 0x70, 0x39, 0x30, 0x5f, 0x73, 0x65, 0x65, + 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, + 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x16, 0x70, 0x39, 0x30, 0x53, + 0x65, 0x65, 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x69, 0x66, 0x66, + 0x4d, 0x73, 0x12, 0x3b, 0x0a, 0x1b, 0x70, 0x39, 0x35, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, + 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, + 0x73, 0x18, 0x23, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x16, 0x70, 0x39, 0x35, 0x53, 0x65, 0x65, 0x6e, + 0x53, 0x6c, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x69, 0x66, 0x66, 0x4d, 0x73, 0x12, + 0x3b, 0x0a, 0x1b, 0x70, 0x39, 0x39, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, + 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x24, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x16, 0x70, 0x39, 0x39, 0x53, 0x65, 0x65, 0x6e, 0x53, 0x6c, 0x6f, + 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x69, 0x66, 0x66, 0x4d, 0x73, 0x12, 0x3b, 0x0a, 0x1b, + 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x25, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x16, 0x6d, 0x61, 0x78, 0x53, 0x65, 0x65, 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x44, 0x69, 0x66, 0x66, 0x4d, 0x73, 0x22, 0x9b, 0x12, 0x0a, 0x29, 0x4c, 0x69, + 0x73, 0x74, 0x46, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x72, 0x73, 0x74, 0x53, + 0x65, 0x65, 0x6e, 0x42, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x42, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x58, 0x0a, 0x15, 0x65, 0x70, 0x6f, 0x63, 0x68, + 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x55, 0x49, 0x6e, + 0x74, 0x33, 0x32, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x12, 0xe0, 0x41, 0x01, 0x9a, 0xb5, + 0x18, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x52, 0x12, 0x65, + 0x70, 0x6f, 0x63, 0x68, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, + 0x65, 0x12, 0x40, 0x0a, 0x10, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, + 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, + 0xe0, 0x41, 0x01, 0x52, 0x0e, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x42, 0x0a, 0x11, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x64, + 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, + 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x44, + 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x67, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x55, 0x49, 0x6e, + 0x74, 0x33, 0x32, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x3e, 0xe0, 0x41, 0x01, 0x8a, 0xb5, + 0x18, 0x15, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x61, + 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x92, 0xb5, 0x18, 0x0f, 0x70, 0x5f, 0x62, 0x79, 0x5f, + 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x9a, 0xb5, 0x18, 0x0b, 0x70, 0x72, + 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, + 0x12, 0x32, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x06, 0x6e, + 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x0e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, + 0x63, 0x62, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x54, 0x0a, 0x1a, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, + 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, + 0x01, 0x52, 0x18, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6d, 0x70, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x47, 0x0a, 0x14, 0x6d, + 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x63, + 0x69, 0x74, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, + 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, + 0x01, 0x52, 0x11, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x47, 0x65, 0x6f, + 0x43, 0x69, 0x74, 0x79, 0x12, 0x4d, 0x0a, 0x17, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x14, 0x6d, + 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x47, 0x65, 0x6f, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x56, 0x0a, 0x1c, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x63, + 0x6f, 0x64, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, + 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, + 0x01, 0x52, 0x18, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x47, 0x65, 0x6f, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x5a, 0x0a, 0x1e, 0x6d, + 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x1a, 0x6d, 0x65, 0x74, + 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x47, 0x65, 0x6f, 0x43, 0x6f, 0x6e, 0x74, 0x69, 0x6e, + 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x5c, 0x0a, 0x19, 0x6d, 0x65, 0x74, 0x61, 0x5f, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x6c, 0x6f, 0x6e, 0x67, 0x69, + 0x74, 0x75, 0x64, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x6f, 0x75, + 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x16, 0x6d, + 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x47, 0x65, 0x6f, 0x4c, 0x6f, 0x6e, 0x67, + 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x5a, 0x0a, 0x18, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, + 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x15, 0x6d, 0x65, 0x74, 0x61, + 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x47, 0x65, 0x6f, 0x4c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, + 0x65, 0x12, 0x75, 0x0a, 0x28, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x6e, 0x6f, 0x6d, 0x6f, 0x75, 0x73, 0x5f, + 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x0f, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, + 0xe0, 0x41, 0x01, 0x52, 0x23, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x47, + 0x65, 0x6f, 0x41, 0x75, 0x74, 0x6f, 0x6e, 0x6f, 0x6d, 0x6f, 0x75, 0x73, 0x53, 0x79, 0x73, 0x74, + 0x65, 0x6d, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x81, 0x01, 0x0a, 0x2e, 0x6d, 0x65, 0x74, + 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x61, 0x75, 0x74, + 0x6f, 0x6e, 0x6f, 0x6d, 0x6f, 0x75, 0x73, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x6f, + 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, + 0x01, 0x52, 0x29, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x47, 0x65, 0x6f, + 0x41, 0x75, 0x74, 0x6f, 0x6e, 0x6f, 0x6d, 0x6f, 0x75, 0x73, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, + 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x0a, 0x08, + 0x6d, 0x69, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, + 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x07, 0x6d, 0x69, 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x12, + 0x31, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x53, 0x6c, + 0x6f, 0x74, 0x12, 0x35, 0x0a, 0x0a, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x55, 0x49, 0x6e, + 0x74, 0x33, 0x32, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, + 0x73, 0x6c, 0x6f, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x53, 0x0a, 0x1b, 0x6d, 0x69, 0x6e, + 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, + 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x16, 0x6d, 0x69, 0x6e, 0x53, 0x65, 0x65, 0x6e, 0x53, + 0x6c, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x69, 0x66, 0x66, 0x4d, 0x73, 0x12, 0x53, + 0x0a, 0x1b, 0x70, 0x30, 0x35, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x15, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, + 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x16, 0x70, 0x30, 0x35, + 0x53, 0x65, 0x65, 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x69, 0x66, + 0x66, 0x4d, 0x73, 0x12, 0x53, 0x0a, 0x1b, 0x70, 0x35, 0x30, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, + 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, + 0x6d, 0x73, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x55, + 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, + 0x52, 0x16, 0x70, 0x35, 0x30, 0x53, 0x65, 0x65, 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x44, 0x69, 0x66, 0x66, 0x4d, 0x73, 0x12, 0x53, 0x0a, 0x1b, 0x61, 0x76, 0x67, 0x5f, + 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, + 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, + 0x63, 0x62, 0x74, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x16, 0x61, 0x76, 0x67, 0x53, 0x65, 0x65, 0x6e, 0x53, 0x6c, + 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x69, 0x66, 0x66, 0x4d, 0x73, 0x12, 0x53, 0x0a, + 0x1b, 0x70, 0x39, 0x30, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x18, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x16, 0x70, 0x39, 0x30, 0x53, + 0x65, 0x65, 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x69, 0x66, 0x66, + 0x4d, 0x73, 0x12, 0x53, 0x0a, 0x1b, 0x70, 0x39, 0x35, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, + 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, + 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x55, 0x49, + 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, + 0x16, 0x70, 0x39, 0x35, 0x53, 0x65, 0x65, 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x44, 0x69, 0x66, 0x66, 0x4d, 0x73, 0x12, 0x53, 0x0a, 0x1b, 0x70, 0x39, 0x39, 0x5f, 0x73, + 0x65, 0x65, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, + 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, + 0x62, 0x74, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, + 0x03, 0xe0, 0x41, 0x01, 0x52, 0x16, 0x70, 0x39, 0x39, 0x53, 0x65, 0x65, 0x6e, 0x53, 0x6c, 0x6f, + 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x69, 0x66, 0x66, 0x4d, 0x73, 0x12, 0x53, 0x0a, 0x1b, + 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x1b, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x16, 0x6d, 0x61, 0x78, 0x53, 0x65, + 0x65, 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x69, 0x66, 0x66, 0x4d, + 0x73, 0x12, 0x20, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x1c, + 0x20, 0x01, 0x28, 0x05, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, + 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x70, 0x61, + 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1e, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x5f, 0x62, 0x79, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x07, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x22, 0xc8, 0x01, 0x0a, 0x2a, 0x4c, 0x69, 0x73, 0x74, + 0x46, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x72, 0x73, 0x74, 0x53, 0x65, 0x65, + 0x6e, 0x42, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x42, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x72, 0x0a, 0x25, 0x66, 0x63, 0x74, 0x5f, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x5f, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x62, + 0x79, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x62, 0x79, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x46, 0x63, 0x74, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x72, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x42, 0x79, 0x4e, + 0x6f, 0x64, 0x65, 0x42, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x1e, 0x66, 0x63, 0x74, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x72, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x42, 0x79, 0x4e, + 0x6f, 0x64, 0x65, 0x42, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, + 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x22, 0x5d, 0x0a, 0x28, 0x47, 0x65, 0x74, 0x46, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x46, 0x69, 0x72, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x42, 0x79, 0x4e, 0x6f, 0x64, 0x65, + 0x42, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, + 0x0a, 0x15, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x61, + 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x65, + 0x70, 0x6f, 0x63, 0x68, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, + 0x65, 0x22, 0x64, 0x0a, 0x29, 0x47, 0x65, 0x74, 0x46, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x46, 0x69, 0x72, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x42, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x42, + 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, + 0x0a, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63, + 0x62, 0x74, 0x2e, 0x46, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x72, 0x73, 0x74, + 0x53, 0x65, 0x65, 0x6e, 0x42, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x42, 0x79, 0x45, 0x70, 0x6f, 0x63, + 0x68, 0x52, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x32, 0xfe, 0x02, 0x0a, 0x25, 0x46, 0x63, 0x74, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x72, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x42, 0x79, 0x4e, + 0x6f, 0x64, 0x65, 0x42, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x12, 0x9e, 0x01, 0x0a, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2e, 0x2e, 0x63, 0x62, 0x74, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x72, + 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x42, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x42, 0x79, 0x45, 0x70, + 0x6f, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x63, 0x62, 0x74, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x72, + 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x42, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x42, 0x79, 0x45, 0x70, + 0x6f, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x2f, 0x12, 0x2d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x66, 0x63, 0x74, + 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, + 0x6e, 0x5f, 0x62, 0x79, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x62, 0x79, 0x5f, 0x65, 0x70, 0x6f, + 0x63, 0x68, 0x12, 0xb3, 0x01, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x2d, 0x2e, 0x63, 0x62, 0x74, + 0x2e, 0x47, 0x65, 0x74, 0x46, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x72, 0x73, + 0x74, 0x53, 0x65, 0x65, 0x6e, 0x42, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x42, 0x79, 0x45, 0x70, 0x6f, + 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x63, 0x62, 0x74, 0x2e, + 0x47, 0x65, 0x74, 0x46, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x72, 0x73, 0x74, + 0x53, 0x65, 0x65, 0x6e, 0x42, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x42, 0x79, 0x45, 0x70, 0x6f, 0x63, + 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4d, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x47, 0x12, 0x45, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x66, 0x63, 0x74, 0x5f, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, + 0x62, 0x79, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x62, 0x79, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, + 0x2f, 0x7b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x61, + 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x7d, 0x42, 0x36, 0x5a, 0x34, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x74, 0x68, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x6f, + 0x70, 0x73, 0x2f, 0x78, 0x61, 0x74, 0x75, 0x2d, 0x63, 0x62, 0x74, 0x2f, 0x70, 0x6b, 0x67, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x68, 0x6f, 0x75, 0x73, 0x65, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_fct_block_first_seen_by_node_by_epoch_proto_rawDescOnce sync.Once + file_fct_block_first_seen_by_node_by_epoch_proto_rawDescData = file_fct_block_first_seen_by_node_by_epoch_proto_rawDesc +) + +func file_fct_block_first_seen_by_node_by_epoch_proto_rawDescGZIP() []byte { + file_fct_block_first_seen_by_node_by_epoch_proto_rawDescOnce.Do(func() { + file_fct_block_first_seen_by_node_by_epoch_proto_rawDescData = protoimpl.X.CompressGZIP(file_fct_block_first_seen_by_node_by_epoch_proto_rawDescData) + }) + return file_fct_block_first_seen_by_node_by_epoch_proto_rawDescData +} + +var file_fct_block_first_seen_by_node_by_epoch_proto_msgTypes = make([]protoimpl.MessageInfo, 5) +var file_fct_block_first_seen_by_node_by_epoch_proto_goTypes = []any{ + (*FctBlockFirstSeenByNodeByEpoch)(nil), // 0: cbt.FctBlockFirstSeenByNodeByEpoch + (*ListFctBlockFirstSeenByNodeByEpochRequest)(nil), // 1: cbt.ListFctBlockFirstSeenByNodeByEpochRequest + (*ListFctBlockFirstSeenByNodeByEpochResponse)(nil), // 2: cbt.ListFctBlockFirstSeenByNodeByEpochResponse + (*GetFctBlockFirstSeenByNodeByEpochRequest)(nil), // 3: cbt.GetFctBlockFirstSeenByNodeByEpochRequest + (*GetFctBlockFirstSeenByNodeByEpochResponse)(nil), // 4: cbt.GetFctBlockFirstSeenByNodeByEpochResponse + (*wrapperspb.DoubleValue)(nil), // 5: google.protobuf.DoubleValue + (*wrapperspb.UInt32Value)(nil), // 6: google.protobuf.UInt32Value + (*wrapperspb.StringValue)(nil), // 7: google.protobuf.StringValue + (*UInt32Filter)(nil), // 8: cbt.UInt32Filter + (*StringFilter)(nil), // 9: cbt.StringFilter + (*NullableUInt32Filter)(nil), // 10: cbt.NullableUInt32Filter + (*NullableStringFilter)(nil), // 11: cbt.NullableStringFilter + (*UInt64Filter)(nil), // 12: cbt.UInt64Filter +} +var file_fct_block_first_seen_by_node_by_epoch_proto_depIdxs = []int32{ + 5, // 0: cbt.FctBlockFirstSeenByNodeByEpoch.meta_client_geo_longitude:type_name -> google.protobuf.DoubleValue + 5, // 1: cbt.FctBlockFirstSeenByNodeByEpoch.meta_client_geo_latitude:type_name -> google.protobuf.DoubleValue + 6, // 2: cbt.FctBlockFirstSeenByNodeByEpoch.meta_client_geo_autonomous_system_number:type_name -> google.protobuf.UInt32Value + 7, // 3: cbt.FctBlockFirstSeenByNodeByEpoch.meta_client_geo_autonomous_system_organization:type_name -> google.protobuf.StringValue + 8, // 4: cbt.ListFctBlockFirstSeenByNodeByEpochRequest.epoch_start_date_time:type_name -> cbt.UInt32Filter + 9, // 5: cbt.ListFctBlockFirstSeenByNodeByEpochRequest.meta_client_name:type_name -> cbt.StringFilter + 8, // 6: cbt.ListFctBlockFirstSeenByNodeByEpochRequest.updated_date_time:type_name -> cbt.UInt32Filter + 8, // 7: cbt.ListFctBlockFirstSeenByNodeByEpochRequest.epoch:type_name -> cbt.UInt32Filter + 9, // 8: cbt.ListFctBlockFirstSeenByNodeByEpochRequest.username:type_name -> cbt.StringFilter + 9, // 9: cbt.ListFctBlockFirstSeenByNodeByEpochRequest.node_id:type_name -> cbt.StringFilter + 9, // 10: cbt.ListFctBlockFirstSeenByNodeByEpochRequest.classification:type_name -> cbt.StringFilter + 9, // 11: cbt.ListFctBlockFirstSeenByNodeByEpochRequest.meta_client_implementation:type_name -> cbt.StringFilter + 9, // 12: cbt.ListFctBlockFirstSeenByNodeByEpochRequest.meta_client_geo_city:type_name -> cbt.StringFilter + 9, // 13: cbt.ListFctBlockFirstSeenByNodeByEpochRequest.meta_client_geo_country:type_name -> cbt.StringFilter + 9, // 14: cbt.ListFctBlockFirstSeenByNodeByEpochRequest.meta_client_geo_country_code:type_name -> cbt.StringFilter + 9, // 15: cbt.ListFctBlockFirstSeenByNodeByEpochRequest.meta_client_geo_continent_code:type_name -> cbt.StringFilter + 5, // 16: cbt.ListFctBlockFirstSeenByNodeByEpochRequest.meta_client_geo_longitude:type_name -> google.protobuf.DoubleValue + 5, // 17: cbt.ListFctBlockFirstSeenByNodeByEpochRequest.meta_client_geo_latitude:type_name -> google.protobuf.DoubleValue + 10, // 18: cbt.ListFctBlockFirstSeenByNodeByEpochRequest.meta_client_geo_autonomous_system_number:type_name -> cbt.NullableUInt32Filter + 11, // 19: cbt.ListFctBlockFirstSeenByNodeByEpochRequest.meta_client_geo_autonomous_system_organization:type_name -> cbt.NullableStringFilter + 12, // 20: cbt.ListFctBlockFirstSeenByNodeByEpochRequest.min_slot:type_name -> cbt.UInt64Filter + 12, // 21: cbt.ListFctBlockFirstSeenByNodeByEpochRequest.max_slot:type_name -> cbt.UInt64Filter + 8, // 22: cbt.ListFctBlockFirstSeenByNodeByEpochRequest.slot_count:type_name -> cbt.UInt32Filter + 8, // 23: cbt.ListFctBlockFirstSeenByNodeByEpochRequest.min_seen_slot_start_diff_ms:type_name -> cbt.UInt32Filter + 8, // 24: cbt.ListFctBlockFirstSeenByNodeByEpochRequest.p05_seen_slot_start_diff_ms:type_name -> cbt.UInt32Filter + 8, // 25: cbt.ListFctBlockFirstSeenByNodeByEpochRequest.p50_seen_slot_start_diff_ms:type_name -> cbt.UInt32Filter + 8, // 26: cbt.ListFctBlockFirstSeenByNodeByEpochRequest.avg_seen_slot_start_diff_ms:type_name -> cbt.UInt32Filter + 8, // 27: cbt.ListFctBlockFirstSeenByNodeByEpochRequest.p90_seen_slot_start_diff_ms:type_name -> cbt.UInt32Filter + 8, // 28: cbt.ListFctBlockFirstSeenByNodeByEpochRequest.p95_seen_slot_start_diff_ms:type_name -> cbt.UInt32Filter + 8, // 29: cbt.ListFctBlockFirstSeenByNodeByEpochRequest.p99_seen_slot_start_diff_ms:type_name -> cbt.UInt32Filter + 8, // 30: cbt.ListFctBlockFirstSeenByNodeByEpochRequest.max_seen_slot_start_diff_ms:type_name -> cbt.UInt32Filter + 0, // 31: cbt.ListFctBlockFirstSeenByNodeByEpochResponse.fct_block_first_seen_by_node_by_epoch:type_name -> cbt.FctBlockFirstSeenByNodeByEpoch + 0, // 32: cbt.GetFctBlockFirstSeenByNodeByEpochResponse.item:type_name -> cbt.FctBlockFirstSeenByNodeByEpoch + 1, // 33: cbt.FctBlockFirstSeenByNodeByEpochService.List:input_type -> cbt.ListFctBlockFirstSeenByNodeByEpochRequest + 3, // 34: cbt.FctBlockFirstSeenByNodeByEpochService.Get:input_type -> cbt.GetFctBlockFirstSeenByNodeByEpochRequest + 2, // 35: cbt.FctBlockFirstSeenByNodeByEpochService.List:output_type -> cbt.ListFctBlockFirstSeenByNodeByEpochResponse + 4, // 36: cbt.FctBlockFirstSeenByNodeByEpochService.Get:output_type -> cbt.GetFctBlockFirstSeenByNodeByEpochResponse + 35, // [35:37] is the sub-list for method output_type + 33, // [33:35] is the sub-list for method input_type + 33, // [33:33] is the sub-list for extension type_name + 33, // [33:33] is the sub-list for extension extendee + 0, // [0:33] is the sub-list for field type_name +} + +func init() { file_fct_block_first_seen_by_node_by_epoch_proto_init() } +func file_fct_block_first_seen_by_node_by_epoch_proto_init() { + if File_fct_block_first_seen_by_node_by_epoch_proto != nil { + return + } + file_common_proto_init() + if !protoimpl.UnsafeEnabled { + file_fct_block_first_seen_by_node_by_epoch_proto_msgTypes[0].Exporter = func(v any, i int) any { + switch v := v.(*FctBlockFirstSeenByNodeByEpoch); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_fct_block_first_seen_by_node_by_epoch_proto_msgTypes[1].Exporter = func(v any, i int) any { + switch v := v.(*ListFctBlockFirstSeenByNodeByEpochRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_fct_block_first_seen_by_node_by_epoch_proto_msgTypes[2].Exporter = func(v any, i int) any { + switch v := v.(*ListFctBlockFirstSeenByNodeByEpochResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_fct_block_first_seen_by_node_by_epoch_proto_msgTypes[3].Exporter = func(v any, i int) any { + switch v := v.(*GetFctBlockFirstSeenByNodeByEpochRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_fct_block_first_seen_by_node_by_epoch_proto_msgTypes[4].Exporter = func(v any, i int) any { + switch v := v.(*GetFctBlockFirstSeenByNodeByEpochResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_fct_block_first_seen_by_node_by_epoch_proto_rawDesc, + NumEnums: 0, + NumMessages: 5, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_fct_block_first_seen_by_node_by_epoch_proto_goTypes, + DependencyIndexes: file_fct_block_first_seen_by_node_by_epoch_proto_depIdxs, + MessageInfos: file_fct_block_first_seen_by_node_by_epoch_proto_msgTypes, + }.Build() + File_fct_block_first_seen_by_node_by_epoch_proto = out.File + file_fct_block_first_seen_by_node_by_epoch_proto_rawDesc = nil + file_fct_block_first_seen_by_node_by_epoch_proto_goTypes = nil + file_fct_block_first_seen_by_node_by_epoch_proto_depIdxs = nil +} diff --git a/pkg/proto/clickhouse/fct_block_first_seen_by_node_by_epoch.proto b/pkg/proto/clickhouse/fct_block_first_seen_by_node_by_epoch.proto new file mode 100644 index 00000000..e59d96ce --- /dev/null +++ b/pkg/proto/clickhouse/fct_block_first_seen_by_node_by_epoch.proto @@ -0,0 +1,177 @@ +syntax = "proto3"; + +package cbt; + +import "common.proto"; +import "google/protobuf/wrappers.proto"; +import "google/api/annotations.proto"; +import "google/api/field_behavior.proto"; +import "clickhouse/annotations.proto"; + +option go_package = "github.com/ethpandaops/xatu-cbt/pkg/proto/clickhouse"; +// Block first seen statistics by node aggregated by epoch + +message FctBlockFirstSeenByNodeByEpoch { + // Timestamp when the record was last updated + uint32 updated_date_time = 11; + // Epoch number + uint32 epoch = 12; + // The wall clock time when the epoch started + uint32 epoch_start_date_time = 13; + // Username of the node + string username = 14; + // ID of the node + string node_id = 15; + // Classification of the node, e.g. "individual", "corporate", "internal" (aka ethPandaOps) or "unclassified" + string classification = 16; + // Name of the client + string meta_client_name = 17; + // Implementation of the client + string meta_client_implementation = 18; + // City of the client + string meta_client_geo_city = 19; + // Country of the client + string meta_client_geo_country = 20; + // Country code of the client + string meta_client_geo_country_code = 21; + // Continent code of the client + string meta_client_geo_continent_code = 22; + // Longitude of the client + google.protobuf.DoubleValue meta_client_geo_longitude = 23; + // Latitude of the client + google.protobuf.DoubleValue meta_client_geo_latitude = 24; + // Autonomous system number of the client + google.protobuf.UInt32Value meta_client_geo_autonomous_system_number = 25; + // Autonomous system organization of the client + google.protobuf.StringValue meta_client_geo_autonomous_system_organization = 26; + // Minimum slot number in this epoch + uint64 min_slot = 27; + // Maximum slot number in this epoch + uint64 max_slot = 28; + // Number of slots with blocks seen in this epoch + uint32 slot_count = 29; + // Minimum time from slot start for the node to see a block (milliseconds) + uint32 min_seen_slot_start_diff_ms = 30; + // 5th percentile time from slot start (milliseconds) + uint32 p05_seen_slot_start_diff_ms = 31; + // Median (p50) time from slot start (milliseconds) + uint32 p50_seen_slot_start_diff_ms = 32; + // Average time from slot start (milliseconds) + uint32 avg_seen_slot_start_diff_ms = 33; + // 90th percentile time from slot start (milliseconds) + uint32 p90_seen_slot_start_diff_ms = 34; + // 95th percentile time from slot start (milliseconds) + uint32 p95_seen_slot_start_diff_ms = 35; + // 99th percentile time from slot start (milliseconds) + uint32 p99_seen_slot_start_diff_ms = 36; + // Maximum time from slot start (milliseconds) + uint32 max_seen_slot_start_diff_ms = 37; +} + +// Request for listing fct_block_first_seen_by_node_by_epoch records +message ListFctBlockFirstSeenByNodeByEpochRequest { + // Filter by epoch_start_date_time - The wall clock time when the epoch started (PRIMARY KEY - required unless using alternatives: epoch) + UInt32Filter epoch_start_date_time = 1 [(google.api.field_behavior) = OPTIONAL, (clickhouse.v1.required_group) = "primary_key"]; + + // Filter by meta_client_name - Name of the client (ORDER BY column 2 - optional) + StringFilter meta_client_name = 2 [(google.api.field_behavior) = OPTIONAL]; + + // Filter by updated_date_time - Timestamp when the record was last updated (optional) + UInt32Filter updated_date_time = 3 [(google.api.field_behavior) = OPTIONAL]; + // Filter by epoch - Epoch number (PROJECTION: p_by_epoch_node - alternative to epoch_start_date_time) + UInt32Filter epoch = 4 [(google.api.field_behavior) = OPTIONAL, (clickhouse.v1.projection_name) = "p_by_epoch_node", (clickhouse.v1.projection_alternative_for) = "epoch_start_date_time", (clickhouse.v1.required_group) = "primary_key"]; + // Filter by username - Username of the node (optional) + StringFilter username = 5 [(google.api.field_behavior) = OPTIONAL]; + // Filter by node_id - ID of the node (optional) + StringFilter node_id = 6 [(google.api.field_behavior) = OPTIONAL]; + // Filter by classification - Classification of the node, e.g. "individual", "corporate", "internal" (aka ethPandaOps) or "unclassified" (optional) + StringFilter classification = 7 [(google.api.field_behavior) = OPTIONAL]; + // Filter by meta_client_implementation - Implementation of the client (optional) + StringFilter meta_client_implementation = 8 [(google.api.field_behavior) = OPTIONAL]; + // Filter by meta_client_geo_city - City of the client (optional) + StringFilter meta_client_geo_city = 9 [(google.api.field_behavior) = OPTIONAL]; + // Filter by meta_client_geo_country - Country of the client (optional) + StringFilter meta_client_geo_country = 10 [(google.api.field_behavior) = OPTIONAL]; + // Filter by meta_client_geo_country_code - Country code of the client (optional) + StringFilter meta_client_geo_country_code = 11 [(google.api.field_behavior) = OPTIONAL]; + // Filter by meta_client_geo_continent_code - Continent code of the client (optional) + StringFilter meta_client_geo_continent_code = 12 [(google.api.field_behavior) = OPTIONAL]; + // Filter by meta_client_geo_longitude - Longitude of the client (optional) + google.protobuf.DoubleValue meta_client_geo_longitude = 13 [(google.api.field_behavior) = OPTIONAL]; + // Filter by meta_client_geo_latitude - Latitude of the client (optional) + google.protobuf.DoubleValue meta_client_geo_latitude = 14 [(google.api.field_behavior) = OPTIONAL]; + // Filter by meta_client_geo_autonomous_system_number - Autonomous system number of the client (optional) + NullableUInt32Filter meta_client_geo_autonomous_system_number = 15 [(google.api.field_behavior) = OPTIONAL]; + // Filter by meta_client_geo_autonomous_system_organization - Autonomous system organization of the client (optional) + NullableStringFilter meta_client_geo_autonomous_system_organization = 16 [(google.api.field_behavior) = OPTIONAL]; + // Filter by min_slot - Minimum slot number in this epoch (optional) + UInt64Filter min_slot = 17 [(google.api.field_behavior) = OPTIONAL]; + // Filter by max_slot - Maximum slot number in this epoch (optional) + UInt64Filter max_slot = 18 [(google.api.field_behavior) = OPTIONAL]; + // Filter by slot_count - Number of slots with blocks seen in this epoch (optional) + UInt32Filter slot_count = 19 [(google.api.field_behavior) = OPTIONAL]; + // Filter by min_seen_slot_start_diff_ms - Minimum time from slot start for the node to see a block (milliseconds) (optional) + UInt32Filter min_seen_slot_start_diff_ms = 20 [(google.api.field_behavior) = OPTIONAL]; + // Filter by p05_seen_slot_start_diff_ms - 5th percentile time from slot start (milliseconds) (optional) + UInt32Filter p05_seen_slot_start_diff_ms = 21 [(google.api.field_behavior) = OPTIONAL]; + // Filter by p50_seen_slot_start_diff_ms - Median (p50) time from slot start (milliseconds) (optional) + UInt32Filter p50_seen_slot_start_diff_ms = 22 [(google.api.field_behavior) = OPTIONAL]; + // Filter by avg_seen_slot_start_diff_ms - Average time from slot start (milliseconds) (optional) + UInt32Filter avg_seen_slot_start_diff_ms = 23 [(google.api.field_behavior) = OPTIONAL]; + // Filter by p90_seen_slot_start_diff_ms - 90th percentile time from slot start (milliseconds) (optional) + UInt32Filter p90_seen_slot_start_diff_ms = 24 [(google.api.field_behavior) = OPTIONAL]; + // Filter by p95_seen_slot_start_diff_ms - 95th percentile time from slot start (milliseconds) (optional) + UInt32Filter p95_seen_slot_start_diff_ms = 25 [(google.api.field_behavior) = OPTIONAL]; + // Filter by p99_seen_slot_start_diff_ms - 99th percentile time from slot start (milliseconds) (optional) + UInt32Filter p99_seen_slot_start_diff_ms = 26 [(google.api.field_behavior) = OPTIONAL]; + // Filter by max_seen_slot_start_diff_ms - Maximum time from slot start (milliseconds) (optional) + UInt32Filter max_seen_slot_start_diff_ms = 27 [(google.api.field_behavior) = OPTIONAL]; + + // The maximum number of fct_block_first_seen_by_node_by_epoch to return. + // If unspecified, at most 100 items will be returned. + // The maximum value is 10000; values above 10000 will be coerced to 10000. + int32 page_size = 28 [(google.api.field_behavior) = OPTIONAL]; + // A page token, received from a previous `ListFctBlockFirstSeenByNodeByEpoch` call. + // Provide this to retrieve the subsequent page. + string page_token = 29 [(google.api.field_behavior) = OPTIONAL]; + // The order of results. Format: comma-separated list of fields. + // Example: "foo,bar" or "foo desc,bar" for descending order on foo. + // If unspecified, results will be returned in the default order. + string order_by = 30 [(google.api.field_behavior) = OPTIONAL]; +} + +// Response for listing fct_block_first_seen_by_node_by_epoch records +message ListFctBlockFirstSeenByNodeByEpochResponse { + // The list of fct_block_first_seen_by_node_by_epoch. + repeated FctBlockFirstSeenByNodeByEpoch fct_block_first_seen_by_node_by_epoch = 1; + // A token, which can be sent as `page_token` to retrieve the next page. + // If this field is omitted, there are no subsequent pages. + string next_page_token = 2; +} + +// Request for getting a single fct_block_first_seen_by_node_by_epoch record by primary key +message GetFctBlockFirstSeenByNodeByEpochRequest { + // The wall clock time when the epoch started + uint32 epoch_start_date_time = 1; // Primary key (required) +} + +// Response for getting a single fct_block_first_seen_by_node_by_epoch record +message GetFctBlockFirstSeenByNodeByEpochResponse { + FctBlockFirstSeenByNodeByEpoch item = 1; +} + +// Query fct_block_first_seen_by_node_by_epoch data +service FctBlockFirstSeenByNodeByEpochService { + // List records | Retrieve paginated results with optional filtering + rpc List(ListFctBlockFirstSeenByNodeByEpochRequest) returns (ListFctBlockFirstSeenByNodeByEpochResponse) { + option (google.api.http) = { + get: "/api/v1/fct_block_first_seen_by_node_by_epoch" + }; + } + // Get record | Retrieve a single record by epoch_start_date_time + rpc Get(GetFctBlockFirstSeenByNodeByEpochRequest) returns (GetFctBlockFirstSeenByNodeByEpochResponse) { + option (google.api.http) = { + get: "/api/v1/fct_block_first_seen_by_node_by_epoch/{epoch_start_date_time}" + }; + } +} diff --git a/pkg/proto/clickhouse/fct_block_first_seen_by_node_daily.go b/pkg/proto/clickhouse/fct_block_first_seen_by_node_daily.go new file mode 100644 index 00000000..cef63e69 --- /dev/null +++ b/pkg/proto/clickhouse/fct_block_first_seen_by_node_daily.go @@ -0,0 +1,893 @@ +// Code generated by clickhouse-proto-gen. DO NOT EDIT. +// SQL query builder for fct_block_first_seen_by_node_daily + +package clickhouse + +import ( + "fmt" +) + +// BuildListFctBlockFirstSeenByNodeDailyQuery constructs a parameterized SQL query from a ListFctBlockFirstSeenByNodeDailyRequest +// +// Available projections: +// - p_by_day_node (primary key: day) +// +// Use WithProjection() option to select a specific projection. +func BuildListFctBlockFirstSeenByNodeDailyQuery(req *ListFctBlockFirstSeenByNodeDailyRequest, options ...QueryOption) (SQLQuery, error) { + // Validate that at least one primary key is provided + // Primary keys can come from base table or projections + if req.Day == nil { + return SQLQuery{}, fmt.Errorf("primary key field day is required") + } + + // Build query using QueryBuilder + qb := NewQueryBuilder() + + // Add primary key filter + switch filter := req.Day.Filter.(type) { + case *StringFilter_Eq: + qb.AddCondition("day", "=", filter.Eq) + case *StringFilter_Ne: + qb.AddCondition("day", "!=", filter.Ne) + case *StringFilter_Contains: + qb.AddLikeCondition("day", "%" + filter.Contains + "%") + case *StringFilter_StartsWith: + qb.AddLikeCondition("day", filter.StartsWith + "%") + case *StringFilter_EndsWith: + qb.AddLikeCondition("day", "%" + filter.EndsWith) + case *StringFilter_Like: + qb.AddLikeCondition("day", filter.Like) + case *StringFilter_NotLike: + qb.AddNotLikeCondition("day", filter.NotLike) + case *StringFilter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("day", StringSliceToInterface(filter.In.Values)) + } + case *StringFilter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("day", StringSliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + + // Add filter for column: updated_date_time + if req.UpdatedDateTime != nil { + switch filter := req.UpdatedDateTime.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("updated_date_time", "=", DateTimeValue{filter.Eq}) + case *UInt32Filter_Ne: + qb.AddCondition("updated_date_time", "!=", DateTimeValue{filter.Ne}) + case *UInt32Filter_Lt: + qb.AddCondition("updated_date_time", "<", DateTimeValue{filter.Lt}) + case *UInt32Filter_Lte: + qb.AddCondition("updated_date_time", "<=", DateTimeValue{filter.Lte}) + case *UInt32Filter_Gt: + qb.AddCondition("updated_date_time", ">", DateTimeValue{filter.Gt}) + case *UInt32Filter_Gte: + qb.AddCondition("updated_date_time", ">=", DateTimeValue{filter.Gte}) + case *UInt32Filter_Between: + qb.AddBetweenCondition("updated_date_time", DateTimeValue{filter.Between.Min}, DateTimeValue{filter.Between.Max.GetValue()}) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + converted := make([]interface{}, len(filter.In.Values)) + for i, v := range filter.In.Values { + converted[i] = DateTimeValue{v} + } + qb.AddInCondition("updated_date_time", converted) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + converted := make([]interface{}, len(filter.NotIn.Values)) + for i, v := range filter.NotIn.Values { + converted[i] = DateTimeValue{v} + } + qb.AddNotInCondition("updated_date_time", converted) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: day_start_date_time + if req.DayStartDateTime != nil { + switch filter := req.DayStartDateTime.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("day_start_date_time", "=", DateTimeValue{filter.Eq}) + case *UInt32Filter_Ne: + qb.AddCondition("day_start_date_time", "!=", DateTimeValue{filter.Ne}) + case *UInt32Filter_Lt: + qb.AddCondition("day_start_date_time", "<", DateTimeValue{filter.Lt}) + case *UInt32Filter_Lte: + qb.AddCondition("day_start_date_time", "<=", DateTimeValue{filter.Lte}) + case *UInt32Filter_Gt: + qb.AddCondition("day_start_date_time", ">", DateTimeValue{filter.Gt}) + case *UInt32Filter_Gte: + qb.AddCondition("day_start_date_time", ">=", DateTimeValue{filter.Gte}) + case *UInt32Filter_Between: + qb.AddBetweenCondition("day_start_date_time", DateTimeValue{filter.Between.Min}, DateTimeValue{filter.Between.Max.GetValue()}) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + converted := make([]interface{}, len(filter.In.Values)) + for i, v := range filter.In.Values { + converted[i] = DateTimeValue{v} + } + qb.AddInCondition("day_start_date_time", converted) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + converted := make([]interface{}, len(filter.NotIn.Values)) + for i, v := range filter.NotIn.Values { + converted[i] = DateTimeValue{v} + } + qb.AddNotInCondition("day_start_date_time", converted) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: username + if req.Username != nil { + switch filter := req.Username.Filter.(type) { + case *StringFilter_Eq: + qb.AddCondition("username", "=", filter.Eq) + case *StringFilter_Ne: + qb.AddCondition("username", "!=", filter.Ne) + case *StringFilter_Contains: + qb.AddLikeCondition("username", "%" + filter.Contains + "%") + case *StringFilter_StartsWith: + qb.AddLikeCondition("username", filter.StartsWith + "%") + case *StringFilter_EndsWith: + qb.AddLikeCondition("username", "%" + filter.EndsWith) + case *StringFilter_Like: + qb.AddLikeCondition("username", filter.Like) + case *StringFilter_NotLike: + qb.AddNotLikeCondition("username", filter.NotLike) + case *StringFilter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("username", StringSliceToInterface(filter.In.Values)) + } + case *StringFilter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("username", StringSliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: node_id + if req.NodeId != nil { + switch filter := req.NodeId.Filter.(type) { + case *StringFilter_Eq: + qb.AddCondition("node_id", "=", filter.Eq) + case *StringFilter_Ne: + qb.AddCondition("node_id", "!=", filter.Ne) + case *StringFilter_Contains: + qb.AddLikeCondition("node_id", "%" + filter.Contains + "%") + case *StringFilter_StartsWith: + qb.AddLikeCondition("node_id", filter.StartsWith + "%") + case *StringFilter_EndsWith: + qb.AddLikeCondition("node_id", "%" + filter.EndsWith) + case *StringFilter_Like: + qb.AddLikeCondition("node_id", filter.Like) + case *StringFilter_NotLike: + qb.AddNotLikeCondition("node_id", filter.NotLike) + case *StringFilter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("node_id", StringSliceToInterface(filter.In.Values)) + } + case *StringFilter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("node_id", StringSliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: classification + if req.Classification != nil { + switch filter := req.Classification.Filter.(type) { + case *StringFilter_Eq: + qb.AddCondition("classification", "=", filter.Eq) + case *StringFilter_Ne: + qb.AddCondition("classification", "!=", filter.Ne) + case *StringFilter_Contains: + qb.AddLikeCondition("classification", "%" + filter.Contains + "%") + case *StringFilter_StartsWith: + qb.AddLikeCondition("classification", filter.StartsWith + "%") + case *StringFilter_EndsWith: + qb.AddLikeCondition("classification", "%" + filter.EndsWith) + case *StringFilter_Like: + qb.AddLikeCondition("classification", filter.Like) + case *StringFilter_NotLike: + qb.AddNotLikeCondition("classification", filter.NotLike) + case *StringFilter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("classification", StringSliceToInterface(filter.In.Values)) + } + case *StringFilter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("classification", StringSliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: meta_client_name + if req.MetaClientName != nil { + switch filter := req.MetaClientName.Filter.(type) { + case *StringFilter_Eq: + qb.AddCondition("meta_client_name", "=", filter.Eq) + case *StringFilter_Ne: + qb.AddCondition("meta_client_name", "!=", filter.Ne) + case *StringFilter_Contains: + qb.AddLikeCondition("meta_client_name", "%" + filter.Contains + "%") + case *StringFilter_StartsWith: + qb.AddLikeCondition("meta_client_name", filter.StartsWith + "%") + case *StringFilter_EndsWith: + qb.AddLikeCondition("meta_client_name", "%" + filter.EndsWith) + case *StringFilter_Like: + qb.AddLikeCondition("meta_client_name", filter.Like) + case *StringFilter_NotLike: + qb.AddNotLikeCondition("meta_client_name", filter.NotLike) + case *StringFilter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("meta_client_name", StringSliceToInterface(filter.In.Values)) + } + case *StringFilter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("meta_client_name", StringSliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: meta_client_implementation + if req.MetaClientImplementation != nil { + switch filter := req.MetaClientImplementation.Filter.(type) { + case *StringFilter_Eq: + qb.AddCondition("meta_client_implementation", "=", filter.Eq) + case *StringFilter_Ne: + qb.AddCondition("meta_client_implementation", "!=", filter.Ne) + case *StringFilter_Contains: + qb.AddLikeCondition("meta_client_implementation", "%" + filter.Contains + "%") + case *StringFilter_StartsWith: + qb.AddLikeCondition("meta_client_implementation", filter.StartsWith + "%") + case *StringFilter_EndsWith: + qb.AddLikeCondition("meta_client_implementation", "%" + filter.EndsWith) + case *StringFilter_Like: + qb.AddLikeCondition("meta_client_implementation", filter.Like) + case *StringFilter_NotLike: + qb.AddNotLikeCondition("meta_client_implementation", filter.NotLike) + case *StringFilter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("meta_client_implementation", StringSliceToInterface(filter.In.Values)) + } + case *StringFilter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("meta_client_implementation", StringSliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: meta_client_geo_city + if req.MetaClientGeoCity != nil { + switch filter := req.MetaClientGeoCity.Filter.(type) { + case *StringFilter_Eq: + qb.AddCondition("meta_client_geo_city", "=", filter.Eq) + case *StringFilter_Ne: + qb.AddCondition("meta_client_geo_city", "!=", filter.Ne) + case *StringFilter_Contains: + qb.AddLikeCondition("meta_client_geo_city", "%" + filter.Contains + "%") + case *StringFilter_StartsWith: + qb.AddLikeCondition("meta_client_geo_city", filter.StartsWith + "%") + case *StringFilter_EndsWith: + qb.AddLikeCondition("meta_client_geo_city", "%" + filter.EndsWith) + case *StringFilter_Like: + qb.AddLikeCondition("meta_client_geo_city", filter.Like) + case *StringFilter_NotLike: + qb.AddNotLikeCondition("meta_client_geo_city", filter.NotLike) + case *StringFilter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("meta_client_geo_city", StringSliceToInterface(filter.In.Values)) + } + case *StringFilter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("meta_client_geo_city", StringSliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: meta_client_geo_country + if req.MetaClientGeoCountry != nil { + switch filter := req.MetaClientGeoCountry.Filter.(type) { + case *StringFilter_Eq: + qb.AddCondition("meta_client_geo_country", "=", filter.Eq) + case *StringFilter_Ne: + qb.AddCondition("meta_client_geo_country", "!=", filter.Ne) + case *StringFilter_Contains: + qb.AddLikeCondition("meta_client_geo_country", "%" + filter.Contains + "%") + case *StringFilter_StartsWith: + qb.AddLikeCondition("meta_client_geo_country", filter.StartsWith + "%") + case *StringFilter_EndsWith: + qb.AddLikeCondition("meta_client_geo_country", "%" + filter.EndsWith) + case *StringFilter_Like: + qb.AddLikeCondition("meta_client_geo_country", filter.Like) + case *StringFilter_NotLike: + qb.AddNotLikeCondition("meta_client_geo_country", filter.NotLike) + case *StringFilter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("meta_client_geo_country", StringSliceToInterface(filter.In.Values)) + } + case *StringFilter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("meta_client_geo_country", StringSliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: meta_client_geo_country_code + if req.MetaClientGeoCountryCode != nil { + switch filter := req.MetaClientGeoCountryCode.Filter.(type) { + case *StringFilter_Eq: + qb.AddCondition("meta_client_geo_country_code", "=", filter.Eq) + case *StringFilter_Ne: + qb.AddCondition("meta_client_geo_country_code", "!=", filter.Ne) + case *StringFilter_Contains: + qb.AddLikeCondition("meta_client_geo_country_code", "%" + filter.Contains + "%") + case *StringFilter_StartsWith: + qb.AddLikeCondition("meta_client_geo_country_code", filter.StartsWith + "%") + case *StringFilter_EndsWith: + qb.AddLikeCondition("meta_client_geo_country_code", "%" + filter.EndsWith) + case *StringFilter_Like: + qb.AddLikeCondition("meta_client_geo_country_code", filter.Like) + case *StringFilter_NotLike: + qb.AddNotLikeCondition("meta_client_geo_country_code", filter.NotLike) + case *StringFilter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("meta_client_geo_country_code", StringSliceToInterface(filter.In.Values)) + } + case *StringFilter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("meta_client_geo_country_code", StringSliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: meta_client_geo_continent_code + if req.MetaClientGeoContinentCode != nil { + switch filter := req.MetaClientGeoContinentCode.Filter.(type) { + case *StringFilter_Eq: + qb.AddCondition("meta_client_geo_continent_code", "=", filter.Eq) + case *StringFilter_Ne: + qb.AddCondition("meta_client_geo_continent_code", "!=", filter.Ne) + case *StringFilter_Contains: + qb.AddLikeCondition("meta_client_geo_continent_code", "%" + filter.Contains + "%") + case *StringFilter_StartsWith: + qb.AddLikeCondition("meta_client_geo_continent_code", filter.StartsWith + "%") + case *StringFilter_EndsWith: + qb.AddLikeCondition("meta_client_geo_continent_code", "%" + filter.EndsWith) + case *StringFilter_Like: + qb.AddLikeCondition("meta_client_geo_continent_code", filter.Like) + case *StringFilter_NotLike: + qb.AddNotLikeCondition("meta_client_geo_continent_code", filter.NotLike) + case *StringFilter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("meta_client_geo_continent_code", StringSliceToInterface(filter.In.Values)) + } + case *StringFilter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("meta_client_geo_continent_code", StringSliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: meta_client_geo_longitude + + // Add filter for column: meta_client_geo_latitude + + // Add filter for column: meta_client_geo_autonomous_system_number + if req.MetaClientGeoAutonomousSystemNumber != nil { + switch filter := req.MetaClientGeoAutonomousSystemNumber.Filter.(type) { + case *NullableUInt32Filter_Eq: + qb.AddCondition("meta_client_geo_autonomous_system_number", "=", filter.Eq) + case *NullableUInt32Filter_Ne: + qb.AddCondition("meta_client_geo_autonomous_system_number", "!=", filter.Ne) + case *NullableUInt32Filter_Lt: + qb.AddCondition("meta_client_geo_autonomous_system_number", "<", filter.Lt) + case *NullableUInt32Filter_Lte: + qb.AddCondition("meta_client_geo_autonomous_system_number", "<=", filter.Lte) + case *NullableUInt32Filter_Gt: + qb.AddCondition("meta_client_geo_autonomous_system_number", ">", filter.Gt) + case *NullableUInt32Filter_Gte: + qb.AddCondition("meta_client_geo_autonomous_system_number", ">=", filter.Gte) + case *NullableUInt32Filter_Between: + qb.AddBetweenCondition("meta_client_geo_autonomous_system_number", filter.Between.Min, filter.Between.Max.GetValue()) + case *NullableUInt32Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("meta_client_geo_autonomous_system_number", UInt32SliceToInterface(filter.In.Values)) + } + case *NullableUInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("meta_client_geo_autonomous_system_number", UInt32SliceToInterface(filter.NotIn.Values)) + } + case *NullableUInt32Filter_IsNull: + qb.AddIsNullCondition("meta_client_geo_autonomous_system_number") + case *NullableUInt32Filter_IsNotNull: + qb.AddIsNotNullCondition("meta_client_geo_autonomous_system_number") + default: + // Unsupported filter type + } + } + + // Add filter for column: meta_client_geo_autonomous_system_organization + if req.MetaClientGeoAutonomousSystemOrganization != nil { + switch filter := req.MetaClientGeoAutonomousSystemOrganization.Filter.(type) { + case *NullableStringFilter_Eq: + qb.AddCondition("meta_client_geo_autonomous_system_organization", "=", filter.Eq) + case *NullableStringFilter_Ne: + qb.AddCondition("meta_client_geo_autonomous_system_organization", "!=", filter.Ne) + case *NullableStringFilter_Contains: + qb.AddLikeCondition("meta_client_geo_autonomous_system_organization", "%" + filter.Contains + "%") + case *NullableStringFilter_StartsWith: + qb.AddLikeCondition("meta_client_geo_autonomous_system_organization", filter.StartsWith + "%") + case *NullableStringFilter_EndsWith: + qb.AddLikeCondition("meta_client_geo_autonomous_system_organization", "%" + filter.EndsWith) + case *NullableStringFilter_Like: + qb.AddLikeCondition("meta_client_geo_autonomous_system_organization", filter.Like) + case *NullableStringFilter_NotLike: + qb.AddNotLikeCondition("meta_client_geo_autonomous_system_organization", filter.NotLike) + case *NullableStringFilter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("meta_client_geo_autonomous_system_organization", StringSliceToInterface(filter.In.Values)) + } + case *NullableStringFilter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("meta_client_geo_autonomous_system_organization", StringSliceToInterface(filter.NotIn.Values)) + } + case *NullableStringFilter_IsNull: + qb.AddIsNullCondition("meta_client_geo_autonomous_system_organization") + case *NullableStringFilter_IsNotNull: + qb.AddIsNotNullCondition("meta_client_geo_autonomous_system_organization") + default: + // Unsupported filter type + } + } + + // Add filter for column: min_slot + if req.MinSlot != nil { + switch filter := req.MinSlot.Filter.(type) { + case *UInt64Filter_Eq: + qb.AddCondition("min_slot", "=", filter.Eq) + case *UInt64Filter_Ne: + qb.AddCondition("min_slot", "!=", filter.Ne) + case *UInt64Filter_Lt: + qb.AddCondition("min_slot", "<", filter.Lt) + case *UInt64Filter_Lte: + qb.AddCondition("min_slot", "<=", filter.Lte) + case *UInt64Filter_Gt: + qb.AddCondition("min_slot", ">", filter.Gt) + case *UInt64Filter_Gte: + qb.AddCondition("min_slot", ">=", filter.Gte) + case *UInt64Filter_Between: + qb.AddBetweenCondition("min_slot", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt64Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("min_slot", UInt64SliceToInterface(filter.In.Values)) + } + case *UInt64Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("min_slot", UInt64SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: max_slot + if req.MaxSlot != nil { + switch filter := req.MaxSlot.Filter.(type) { + case *UInt64Filter_Eq: + qb.AddCondition("max_slot", "=", filter.Eq) + case *UInt64Filter_Ne: + qb.AddCondition("max_slot", "!=", filter.Ne) + case *UInt64Filter_Lt: + qb.AddCondition("max_slot", "<", filter.Lt) + case *UInt64Filter_Lte: + qb.AddCondition("max_slot", "<=", filter.Lte) + case *UInt64Filter_Gt: + qb.AddCondition("max_slot", ">", filter.Gt) + case *UInt64Filter_Gte: + qb.AddCondition("max_slot", ">=", filter.Gte) + case *UInt64Filter_Between: + qb.AddBetweenCondition("max_slot", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt64Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("max_slot", UInt64SliceToInterface(filter.In.Values)) + } + case *UInt64Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("max_slot", UInt64SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: epoch_count + if req.EpochCount != nil { + switch filter := req.EpochCount.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("epoch_count", "=", filter.Eq) + case *UInt32Filter_Ne: + qb.AddCondition("epoch_count", "!=", filter.Ne) + case *UInt32Filter_Lt: + qb.AddCondition("epoch_count", "<", filter.Lt) + case *UInt32Filter_Lte: + qb.AddCondition("epoch_count", "<=", filter.Lte) + case *UInt32Filter_Gt: + qb.AddCondition("epoch_count", ">", filter.Gt) + case *UInt32Filter_Gte: + qb.AddCondition("epoch_count", ">=", filter.Gte) + case *UInt32Filter_Between: + qb.AddBetweenCondition("epoch_count", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("epoch_count", UInt32SliceToInterface(filter.In.Values)) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("epoch_count", UInt32SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: slot_count + if req.SlotCount != nil { + switch filter := req.SlotCount.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("slot_count", "=", filter.Eq) + case *UInt32Filter_Ne: + qb.AddCondition("slot_count", "!=", filter.Ne) + case *UInt32Filter_Lt: + qb.AddCondition("slot_count", "<", filter.Lt) + case *UInt32Filter_Lte: + qb.AddCondition("slot_count", "<=", filter.Lte) + case *UInt32Filter_Gt: + qb.AddCondition("slot_count", ">", filter.Gt) + case *UInt32Filter_Gte: + qb.AddCondition("slot_count", ">=", filter.Gte) + case *UInt32Filter_Between: + qb.AddBetweenCondition("slot_count", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("slot_count", UInt32SliceToInterface(filter.In.Values)) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("slot_count", UInt32SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: min_seen_slot_start_diff_ms + if req.MinSeenSlotStartDiffMs != nil { + switch filter := req.MinSeenSlotStartDiffMs.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("min_seen_slot_start_diff_ms", "=", filter.Eq) + case *UInt32Filter_Ne: + qb.AddCondition("min_seen_slot_start_diff_ms", "!=", filter.Ne) + case *UInt32Filter_Lt: + qb.AddCondition("min_seen_slot_start_diff_ms", "<", filter.Lt) + case *UInt32Filter_Lte: + qb.AddCondition("min_seen_slot_start_diff_ms", "<=", filter.Lte) + case *UInt32Filter_Gt: + qb.AddCondition("min_seen_slot_start_diff_ms", ">", filter.Gt) + case *UInt32Filter_Gte: + qb.AddCondition("min_seen_slot_start_diff_ms", ">=", filter.Gte) + case *UInt32Filter_Between: + qb.AddBetweenCondition("min_seen_slot_start_diff_ms", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("min_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.In.Values)) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("min_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: p05_seen_slot_start_diff_ms + if req.P05SeenSlotStartDiffMs != nil { + switch filter := req.P05SeenSlotStartDiffMs.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("p05_seen_slot_start_diff_ms", "=", filter.Eq) + case *UInt32Filter_Ne: + qb.AddCondition("p05_seen_slot_start_diff_ms", "!=", filter.Ne) + case *UInt32Filter_Lt: + qb.AddCondition("p05_seen_slot_start_diff_ms", "<", filter.Lt) + case *UInt32Filter_Lte: + qb.AddCondition("p05_seen_slot_start_diff_ms", "<=", filter.Lte) + case *UInt32Filter_Gt: + qb.AddCondition("p05_seen_slot_start_diff_ms", ">", filter.Gt) + case *UInt32Filter_Gte: + qb.AddCondition("p05_seen_slot_start_diff_ms", ">=", filter.Gte) + case *UInt32Filter_Between: + qb.AddBetweenCondition("p05_seen_slot_start_diff_ms", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("p05_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.In.Values)) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("p05_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: p50_seen_slot_start_diff_ms + if req.P50SeenSlotStartDiffMs != nil { + switch filter := req.P50SeenSlotStartDiffMs.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("p50_seen_slot_start_diff_ms", "=", filter.Eq) + case *UInt32Filter_Ne: + qb.AddCondition("p50_seen_slot_start_diff_ms", "!=", filter.Ne) + case *UInt32Filter_Lt: + qb.AddCondition("p50_seen_slot_start_diff_ms", "<", filter.Lt) + case *UInt32Filter_Lte: + qb.AddCondition("p50_seen_slot_start_diff_ms", "<=", filter.Lte) + case *UInt32Filter_Gt: + qb.AddCondition("p50_seen_slot_start_diff_ms", ">", filter.Gt) + case *UInt32Filter_Gte: + qb.AddCondition("p50_seen_slot_start_diff_ms", ">=", filter.Gte) + case *UInt32Filter_Between: + qb.AddBetweenCondition("p50_seen_slot_start_diff_ms", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("p50_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.In.Values)) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("p50_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: avg_seen_slot_start_diff_ms + if req.AvgSeenSlotStartDiffMs != nil { + switch filter := req.AvgSeenSlotStartDiffMs.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("avg_seen_slot_start_diff_ms", "=", filter.Eq) + case *UInt32Filter_Ne: + qb.AddCondition("avg_seen_slot_start_diff_ms", "!=", filter.Ne) + case *UInt32Filter_Lt: + qb.AddCondition("avg_seen_slot_start_diff_ms", "<", filter.Lt) + case *UInt32Filter_Lte: + qb.AddCondition("avg_seen_slot_start_diff_ms", "<=", filter.Lte) + case *UInt32Filter_Gt: + qb.AddCondition("avg_seen_slot_start_diff_ms", ">", filter.Gt) + case *UInt32Filter_Gte: + qb.AddCondition("avg_seen_slot_start_diff_ms", ">=", filter.Gte) + case *UInt32Filter_Between: + qb.AddBetweenCondition("avg_seen_slot_start_diff_ms", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("avg_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.In.Values)) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("avg_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: p90_seen_slot_start_diff_ms + if req.P90SeenSlotStartDiffMs != nil { + switch filter := req.P90SeenSlotStartDiffMs.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("p90_seen_slot_start_diff_ms", "=", filter.Eq) + case *UInt32Filter_Ne: + qb.AddCondition("p90_seen_slot_start_diff_ms", "!=", filter.Ne) + case *UInt32Filter_Lt: + qb.AddCondition("p90_seen_slot_start_diff_ms", "<", filter.Lt) + case *UInt32Filter_Lte: + qb.AddCondition("p90_seen_slot_start_diff_ms", "<=", filter.Lte) + case *UInt32Filter_Gt: + qb.AddCondition("p90_seen_slot_start_diff_ms", ">", filter.Gt) + case *UInt32Filter_Gte: + qb.AddCondition("p90_seen_slot_start_diff_ms", ">=", filter.Gte) + case *UInt32Filter_Between: + qb.AddBetweenCondition("p90_seen_slot_start_diff_ms", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("p90_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.In.Values)) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("p90_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: p95_seen_slot_start_diff_ms + if req.P95SeenSlotStartDiffMs != nil { + switch filter := req.P95SeenSlotStartDiffMs.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("p95_seen_slot_start_diff_ms", "=", filter.Eq) + case *UInt32Filter_Ne: + qb.AddCondition("p95_seen_slot_start_diff_ms", "!=", filter.Ne) + case *UInt32Filter_Lt: + qb.AddCondition("p95_seen_slot_start_diff_ms", "<", filter.Lt) + case *UInt32Filter_Lte: + qb.AddCondition("p95_seen_slot_start_diff_ms", "<=", filter.Lte) + case *UInt32Filter_Gt: + qb.AddCondition("p95_seen_slot_start_diff_ms", ">", filter.Gt) + case *UInt32Filter_Gte: + qb.AddCondition("p95_seen_slot_start_diff_ms", ">=", filter.Gte) + case *UInt32Filter_Between: + qb.AddBetweenCondition("p95_seen_slot_start_diff_ms", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("p95_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.In.Values)) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("p95_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: p99_seen_slot_start_diff_ms + if req.P99SeenSlotStartDiffMs != nil { + switch filter := req.P99SeenSlotStartDiffMs.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("p99_seen_slot_start_diff_ms", "=", filter.Eq) + case *UInt32Filter_Ne: + qb.AddCondition("p99_seen_slot_start_diff_ms", "!=", filter.Ne) + case *UInt32Filter_Lt: + qb.AddCondition("p99_seen_slot_start_diff_ms", "<", filter.Lt) + case *UInt32Filter_Lte: + qb.AddCondition("p99_seen_slot_start_diff_ms", "<=", filter.Lte) + case *UInt32Filter_Gt: + qb.AddCondition("p99_seen_slot_start_diff_ms", ">", filter.Gt) + case *UInt32Filter_Gte: + qb.AddCondition("p99_seen_slot_start_diff_ms", ">=", filter.Gte) + case *UInt32Filter_Between: + qb.AddBetweenCondition("p99_seen_slot_start_diff_ms", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("p99_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.In.Values)) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("p99_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: max_seen_slot_start_diff_ms + if req.MaxSeenSlotStartDiffMs != nil { + switch filter := req.MaxSeenSlotStartDiffMs.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("max_seen_slot_start_diff_ms", "=", filter.Eq) + case *UInt32Filter_Ne: + qb.AddCondition("max_seen_slot_start_diff_ms", "!=", filter.Ne) + case *UInt32Filter_Lt: + qb.AddCondition("max_seen_slot_start_diff_ms", "<", filter.Lt) + case *UInt32Filter_Lte: + qb.AddCondition("max_seen_slot_start_diff_ms", "<=", filter.Lte) + case *UInt32Filter_Gt: + qb.AddCondition("max_seen_slot_start_diff_ms", ">", filter.Gt) + case *UInt32Filter_Gte: + qb.AddCondition("max_seen_slot_start_diff_ms", ">=", filter.Gte) + case *UInt32Filter_Between: + qb.AddBetweenCondition("max_seen_slot_start_diff_ms", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("max_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.In.Values)) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("max_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Handle pagination per AIP-132 + // Validate page size + if req.PageSize < 0 { + return SQLQuery{}, fmt.Errorf("page_size must be non-negative, got %d", req.PageSize) + } + if req.PageSize > 10000 { + return SQLQuery{}, fmt.Errorf("page_size must not exceed %d, got %d", 10000, req.PageSize) + } + + var limit, offset uint32 + limit = 100 // Default page size + if req.PageSize > 0 { + limit = uint32(req.PageSize) + } + if req.PageToken != "" { + decodedOffset, err := DecodePageToken(req.PageToken) + if err != nil { + return SQLQuery{}, fmt.Errorf("invalid page_token: %w", err) + } + offset = decodedOffset + } + + // Handle custom ordering if provided + var orderByClause string + if req.OrderBy != "" { + validFields := []string{"updated_date_time", "day", "day_start_date_time", "username", "node_id", "classification", "meta_client_name", "meta_client_implementation", "meta_client_geo_city", "meta_client_geo_country", "meta_client_geo_country_code", "meta_client_geo_continent_code", "meta_client_geo_longitude", "meta_client_geo_latitude", "meta_client_geo_autonomous_system_number", "meta_client_geo_autonomous_system_organization", "min_slot", "max_slot", "epoch_count", "slot_count", "min_seen_slot_start_diff_ms", "p05_seen_slot_start_diff_ms", "p50_seen_slot_start_diff_ms", "avg_seen_slot_start_diff_ms", "p90_seen_slot_start_diff_ms", "p95_seen_slot_start_diff_ms", "p99_seen_slot_start_diff_ms", "max_seen_slot_start_diff_ms"} + orderFields, err := ParseOrderBy(req.OrderBy, validFields) + if err != nil { + return SQLQuery{}, fmt.Errorf("invalid order_by: %w", err) + } + orderByClause = BuildOrderByClause(orderFields) + } else { + // Default sorting by primary key + orderByClause = " ORDER BY day" + ", meta_client_name" + } + + // Build column list + columns := []string{"toUnixTimestamp(`updated_date_time`) AS `updated_date_time`", "toString(`day`) AS `day`", "toUnixTimestamp(`day_start_date_time`) AS `day_start_date_time`", "username", "node_id", "classification", "meta_client_name", "meta_client_implementation", "meta_client_geo_city", "meta_client_geo_country", "meta_client_geo_country_code", "meta_client_geo_continent_code", "meta_client_geo_longitude", "meta_client_geo_latitude", "meta_client_geo_autonomous_system_number", "meta_client_geo_autonomous_system_organization", "min_slot", "max_slot", "epoch_count", "slot_count", "min_seen_slot_start_diff_ms", "p05_seen_slot_start_diff_ms", "p50_seen_slot_start_diff_ms", "avg_seen_slot_start_diff_ms", "p90_seen_slot_start_diff_ms", "p95_seen_slot_start_diff_ms", "p99_seen_slot_start_diff_ms", "max_seen_slot_start_diff_ms"} + + return BuildParameterizedQuery("fct_block_first_seen_by_node_daily", columns, qb, orderByClause, limit, offset, options...) +} + +// BuildGetFctBlockFirstSeenByNodeDailyQuery constructs a parameterized SQL query from a GetFctBlockFirstSeenByNodeDailyRequest +func BuildGetFctBlockFirstSeenByNodeDailyQuery(req *GetFctBlockFirstSeenByNodeDailyRequest, options ...QueryOption) (SQLQuery, error) { + // Validate primary key is provided + if req.Day == "" { + return SQLQuery{}, fmt.Errorf("primary key field day is required") + } + + // Build query with primary key condition + qb := NewQueryBuilder() + qb.AddCondition("day", "=", req.Day) + + // Build ORDER BY clause + orderByClause := " ORDER BY day, meta_client_name" + + // Build column list + columns := []string{"toUnixTimestamp(`updated_date_time`) AS `updated_date_time`", "toString(`day`) AS `day`", "toUnixTimestamp(`day_start_date_time`) AS `day_start_date_time`", "username", "node_id", "classification", "meta_client_name", "meta_client_implementation", "meta_client_geo_city", "meta_client_geo_country", "meta_client_geo_country_code", "meta_client_geo_continent_code", "meta_client_geo_longitude", "meta_client_geo_latitude", "meta_client_geo_autonomous_system_number", "meta_client_geo_autonomous_system_organization", "min_slot", "max_slot", "epoch_count", "slot_count", "min_seen_slot_start_diff_ms", "p05_seen_slot_start_diff_ms", "p50_seen_slot_start_diff_ms", "avg_seen_slot_start_diff_ms", "p90_seen_slot_start_diff_ms", "p95_seen_slot_start_diff_ms", "p99_seen_slot_start_diff_ms", "max_seen_slot_start_diff_ms"} + + // Return single record + return BuildParameterizedQuery("fct_block_first_seen_by_node_daily", columns, qb, orderByClause, 1, 0, options...) +} diff --git a/pkg/proto/clickhouse/fct_block_first_seen_by_node_daily.pb.go b/pkg/proto/clickhouse/fct_block_first_seen_by_node_daily.pb.go new file mode 100644 index 00000000..7d100639 --- /dev/null +++ b/pkg/proto/clickhouse/fct_block_first_seen_by_node_daily.pb.go @@ -0,0 +1,1267 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.34.2 +// protoc (unknown) +// source: fct_block_first_seen_by_node_daily.proto + +package clickhouse + +import ( + _ "github.com/ethpandaops/xatu-cbt/pkg/proto/clickhouse/clickhouse" + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + wrapperspb "google.golang.org/protobuf/types/known/wrapperspb" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type FctBlockFirstSeenByNodeDaily struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Timestamp when the record was last updated + UpdatedDateTime uint32 `protobuf:"varint,11,opt,name=updated_date_time,json=updatedDateTime,proto3" json:"updated_date_time,omitempty"` + // Calendar day (UTC) + Day string `protobuf:"bytes,12,opt,name=day,proto3" json:"day,omitempty"` + // Start of day at midnight UTC + DayStartDateTime uint32 `protobuf:"varint,13,opt,name=day_start_date_time,json=dayStartDateTime,proto3" json:"day_start_date_time,omitempty"` + // Username of the node + Username string `protobuf:"bytes,14,opt,name=username,proto3" json:"username,omitempty"` + // ID of the node + NodeId string `protobuf:"bytes,15,opt,name=node_id,json=nodeId,proto3" json:"node_id,omitempty"` + // Classification of the node, e.g. "individual", "corporate", "internal" (aka ethPandaOps) or "unclassified" + Classification string `protobuf:"bytes,16,opt,name=classification,proto3" json:"classification,omitempty"` + // Name of the client + MetaClientName string `protobuf:"bytes,17,opt,name=meta_client_name,json=metaClientName,proto3" json:"meta_client_name,omitempty"` + // Implementation of the client + MetaClientImplementation string `protobuf:"bytes,18,opt,name=meta_client_implementation,json=metaClientImplementation,proto3" json:"meta_client_implementation,omitempty"` + // City of the client + MetaClientGeoCity string `protobuf:"bytes,19,opt,name=meta_client_geo_city,json=metaClientGeoCity,proto3" json:"meta_client_geo_city,omitempty"` + // Country of the client + MetaClientGeoCountry string `protobuf:"bytes,20,opt,name=meta_client_geo_country,json=metaClientGeoCountry,proto3" json:"meta_client_geo_country,omitempty"` + // Country code of the client + MetaClientGeoCountryCode string `protobuf:"bytes,21,opt,name=meta_client_geo_country_code,json=metaClientGeoCountryCode,proto3" json:"meta_client_geo_country_code,omitempty"` + // Continent code of the client + MetaClientGeoContinentCode string `protobuf:"bytes,22,opt,name=meta_client_geo_continent_code,json=metaClientGeoContinentCode,proto3" json:"meta_client_geo_continent_code,omitempty"` + // Longitude of the client + MetaClientGeoLongitude *wrapperspb.DoubleValue `protobuf:"bytes,23,opt,name=meta_client_geo_longitude,json=metaClientGeoLongitude,proto3" json:"meta_client_geo_longitude,omitempty"` + // Latitude of the client + MetaClientGeoLatitude *wrapperspb.DoubleValue `protobuf:"bytes,24,opt,name=meta_client_geo_latitude,json=metaClientGeoLatitude,proto3" json:"meta_client_geo_latitude,omitempty"` + // Autonomous system number of the client + MetaClientGeoAutonomousSystemNumber *wrapperspb.UInt32Value `protobuf:"bytes,25,opt,name=meta_client_geo_autonomous_system_number,json=metaClientGeoAutonomousSystemNumber,proto3" json:"meta_client_geo_autonomous_system_number,omitempty"` + // Autonomous system organization of the client + MetaClientGeoAutonomousSystemOrganization *wrapperspb.StringValue `protobuf:"bytes,26,opt,name=meta_client_geo_autonomous_system_organization,json=metaClientGeoAutonomousSystemOrganization,proto3" json:"meta_client_geo_autonomous_system_organization,omitempty"` + // Minimum slot number in this day + MinSlot uint64 `protobuf:"varint,27,opt,name=min_slot,json=minSlot,proto3" json:"min_slot,omitempty"` + // Maximum slot number in this day + MaxSlot uint64 `protobuf:"varint,28,opt,name=max_slot,json=maxSlot,proto3" json:"max_slot,omitempty"` + // Number of epochs in this day + EpochCount uint32 `protobuf:"varint,29,opt,name=epoch_count,json=epochCount,proto3" json:"epoch_count,omitempty"` + // Number of slots with blocks seen in this day + SlotCount uint32 `protobuf:"varint,30,opt,name=slot_count,json=slotCount,proto3" json:"slot_count,omitempty"` + // Minimum time from slot start for the node to see a block (milliseconds) + MinSeenSlotStartDiffMs uint32 `protobuf:"varint,31,opt,name=min_seen_slot_start_diff_ms,json=minSeenSlotStartDiffMs,proto3" json:"min_seen_slot_start_diff_ms,omitempty"` + // 5th percentile time from slot start (milliseconds) + P05SeenSlotStartDiffMs uint32 `protobuf:"varint,32,opt,name=p05_seen_slot_start_diff_ms,json=p05SeenSlotStartDiffMs,proto3" json:"p05_seen_slot_start_diff_ms,omitempty"` + // Median (p50) time from slot start (milliseconds) + P50SeenSlotStartDiffMs uint32 `protobuf:"varint,33,opt,name=p50_seen_slot_start_diff_ms,json=p50SeenSlotStartDiffMs,proto3" json:"p50_seen_slot_start_diff_ms,omitempty"` + // Average time from slot start (milliseconds) + AvgSeenSlotStartDiffMs uint32 `protobuf:"varint,34,opt,name=avg_seen_slot_start_diff_ms,json=avgSeenSlotStartDiffMs,proto3" json:"avg_seen_slot_start_diff_ms,omitempty"` + // 90th percentile time from slot start (milliseconds) + P90SeenSlotStartDiffMs uint32 `protobuf:"varint,35,opt,name=p90_seen_slot_start_diff_ms,json=p90SeenSlotStartDiffMs,proto3" json:"p90_seen_slot_start_diff_ms,omitempty"` + // 95th percentile time from slot start (milliseconds) + P95SeenSlotStartDiffMs uint32 `protobuf:"varint,36,opt,name=p95_seen_slot_start_diff_ms,json=p95SeenSlotStartDiffMs,proto3" json:"p95_seen_slot_start_diff_ms,omitempty"` + // 99th percentile time from slot start (milliseconds) + P99SeenSlotStartDiffMs uint32 `protobuf:"varint,37,opt,name=p99_seen_slot_start_diff_ms,json=p99SeenSlotStartDiffMs,proto3" json:"p99_seen_slot_start_diff_ms,omitempty"` + // Maximum time from slot start (milliseconds) + MaxSeenSlotStartDiffMs uint32 `protobuf:"varint,38,opt,name=max_seen_slot_start_diff_ms,json=maxSeenSlotStartDiffMs,proto3" json:"max_seen_slot_start_diff_ms,omitempty"` +} + +func (x *FctBlockFirstSeenByNodeDaily) Reset() { + *x = FctBlockFirstSeenByNodeDaily{} + if protoimpl.UnsafeEnabled { + mi := &file_fct_block_first_seen_by_node_daily_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FctBlockFirstSeenByNodeDaily) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FctBlockFirstSeenByNodeDaily) ProtoMessage() {} + +func (x *FctBlockFirstSeenByNodeDaily) ProtoReflect() protoreflect.Message { + mi := &file_fct_block_first_seen_by_node_daily_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FctBlockFirstSeenByNodeDaily.ProtoReflect.Descriptor instead. +func (*FctBlockFirstSeenByNodeDaily) Descriptor() ([]byte, []int) { + return file_fct_block_first_seen_by_node_daily_proto_rawDescGZIP(), []int{0} +} + +func (x *FctBlockFirstSeenByNodeDaily) GetUpdatedDateTime() uint32 { + if x != nil { + return x.UpdatedDateTime + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeDaily) GetDay() string { + if x != nil { + return x.Day + } + return "" +} + +func (x *FctBlockFirstSeenByNodeDaily) GetDayStartDateTime() uint32 { + if x != nil { + return x.DayStartDateTime + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeDaily) GetUsername() string { + if x != nil { + return x.Username + } + return "" +} + +func (x *FctBlockFirstSeenByNodeDaily) GetNodeId() string { + if x != nil { + return x.NodeId + } + return "" +} + +func (x *FctBlockFirstSeenByNodeDaily) GetClassification() string { + if x != nil { + return x.Classification + } + return "" +} + +func (x *FctBlockFirstSeenByNodeDaily) GetMetaClientName() string { + if x != nil { + return x.MetaClientName + } + return "" +} + +func (x *FctBlockFirstSeenByNodeDaily) GetMetaClientImplementation() string { + if x != nil { + return x.MetaClientImplementation + } + return "" +} + +func (x *FctBlockFirstSeenByNodeDaily) GetMetaClientGeoCity() string { + if x != nil { + return x.MetaClientGeoCity + } + return "" +} + +func (x *FctBlockFirstSeenByNodeDaily) GetMetaClientGeoCountry() string { + if x != nil { + return x.MetaClientGeoCountry + } + return "" +} + +func (x *FctBlockFirstSeenByNodeDaily) GetMetaClientGeoCountryCode() string { + if x != nil { + return x.MetaClientGeoCountryCode + } + return "" +} + +func (x *FctBlockFirstSeenByNodeDaily) GetMetaClientGeoContinentCode() string { + if x != nil { + return x.MetaClientGeoContinentCode + } + return "" +} + +func (x *FctBlockFirstSeenByNodeDaily) GetMetaClientGeoLongitude() *wrapperspb.DoubleValue { + if x != nil { + return x.MetaClientGeoLongitude + } + return nil +} + +func (x *FctBlockFirstSeenByNodeDaily) GetMetaClientGeoLatitude() *wrapperspb.DoubleValue { + if x != nil { + return x.MetaClientGeoLatitude + } + return nil +} + +func (x *FctBlockFirstSeenByNodeDaily) GetMetaClientGeoAutonomousSystemNumber() *wrapperspb.UInt32Value { + if x != nil { + return x.MetaClientGeoAutonomousSystemNumber + } + return nil +} + +func (x *FctBlockFirstSeenByNodeDaily) GetMetaClientGeoAutonomousSystemOrganization() *wrapperspb.StringValue { + if x != nil { + return x.MetaClientGeoAutonomousSystemOrganization + } + return nil +} + +func (x *FctBlockFirstSeenByNodeDaily) GetMinSlot() uint64 { + if x != nil { + return x.MinSlot + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeDaily) GetMaxSlot() uint64 { + if x != nil { + return x.MaxSlot + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeDaily) GetEpochCount() uint32 { + if x != nil { + return x.EpochCount + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeDaily) GetSlotCount() uint32 { + if x != nil { + return x.SlotCount + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeDaily) GetMinSeenSlotStartDiffMs() uint32 { + if x != nil { + return x.MinSeenSlotStartDiffMs + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeDaily) GetP05SeenSlotStartDiffMs() uint32 { + if x != nil { + return x.P05SeenSlotStartDiffMs + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeDaily) GetP50SeenSlotStartDiffMs() uint32 { + if x != nil { + return x.P50SeenSlotStartDiffMs + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeDaily) GetAvgSeenSlotStartDiffMs() uint32 { + if x != nil { + return x.AvgSeenSlotStartDiffMs + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeDaily) GetP90SeenSlotStartDiffMs() uint32 { + if x != nil { + return x.P90SeenSlotStartDiffMs + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeDaily) GetP95SeenSlotStartDiffMs() uint32 { + if x != nil { + return x.P95SeenSlotStartDiffMs + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeDaily) GetP99SeenSlotStartDiffMs() uint32 { + if x != nil { + return x.P99SeenSlotStartDiffMs + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeDaily) GetMaxSeenSlotStartDiffMs() uint32 { + if x != nil { + return x.MaxSeenSlotStartDiffMs + } + return 0 +} + +// Request for listing fct_block_first_seen_by_node_daily records +type ListFctBlockFirstSeenByNodeDailyRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Filter by day - Calendar day (UTC) (PRIMARY KEY - required) + Day *StringFilter `protobuf:"bytes,1,opt,name=day,proto3" json:"day,omitempty"` + // Filter by meta_client_name - Name of the client (ORDER BY column 2 - optional) + MetaClientName *StringFilter `protobuf:"bytes,2,opt,name=meta_client_name,json=metaClientName,proto3" json:"meta_client_name,omitempty"` + // Filter by updated_date_time - Timestamp when the record was last updated (optional) + UpdatedDateTime *UInt32Filter `protobuf:"bytes,3,opt,name=updated_date_time,json=updatedDateTime,proto3" json:"updated_date_time,omitempty"` + // Filter by day_start_date_time - Start of day at midnight UTC (optional) + DayStartDateTime *UInt32Filter `protobuf:"bytes,4,opt,name=day_start_date_time,json=dayStartDateTime,proto3" json:"day_start_date_time,omitempty"` + // Filter by username - Username of the node (optional) + Username *StringFilter `protobuf:"bytes,5,opt,name=username,proto3" json:"username,omitempty"` + // Filter by node_id - ID of the node (optional) + NodeId *StringFilter `protobuf:"bytes,6,opt,name=node_id,json=nodeId,proto3" json:"node_id,omitempty"` + // Filter by classification - Classification of the node, e.g. "individual", "corporate", "internal" (aka ethPandaOps) or "unclassified" (optional) + Classification *StringFilter `protobuf:"bytes,7,opt,name=classification,proto3" json:"classification,omitempty"` + // Filter by meta_client_implementation - Implementation of the client (optional) + MetaClientImplementation *StringFilter `protobuf:"bytes,8,opt,name=meta_client_implementation,json=metaClientImplementation,proto3" json:"meta_client_implementation,omitempty"` + // Filter by meta_client_geo_city - City of the client (optional) + MetaClientGeoCity *StringFilter `protobuf:"bytes,9,opt,name=meta_client_geo_city,json=metaClientGeoCity,proto3" json:"meta_client_geo_city,omitempty"` + // Filter by meta_client_geo_country - Country of the client (optional) + MetaClientGeoCountry *StringFilter `protobuf:"bytes,10,opt,name=meta_client_geo_country,json=metaClientGeoCountry,proto3" json:"meta_client_geo_country,omitempty"` + // Filter by meta_client_geo_country_code - Country code of the client (optional) + MetaClientGeoCountryCode *StringFilter `protobuf:"bytes,11,opt,name=meta_client_geo_country_code,json=metaClientGeoCountryCode,proto3" json:"meta_client_geo_country_code,omitempty"` + // Filter by meta_client_geo_continent_code - Continent code of the client (optional) + MetaClientGeoContinentCode *StringFilter `protobuf:"bytes,12,opt,name=meta_client_geo_continent_code,json=metaClientGeoContinentCode,proto3" json:"meta_client_geo_continent_code,omitempty"` + // Filter by meta_client_geo_longitude - Longitude of the client (optional) + MetaClientGeoLongitude *wrapperspb.DoubleValue `protobuf:"bytes,13,opt,name=meta_client_geo_longitude,json=metaClientGeoLongitude,proto3" json:"meta_client_geo_longitude,omitempty"` + // Filter by meta_client_geo_latitude - Latitude of the client (optional) + MetaClientGeoLatitude *wrapperspb.DoubleValue `protobuf:"bytes,14,opt,name=meta_client_geo_latitude,json=metaClientGeoLatitude,proto3" json:"meta_client_geo_latitude,omitempty"` + // Filter by meta_client_geo_autonomous_system_number - Autonomous system number of the client (optional) + MetaClientGeoAutonomousSystemNumber *NullableUInt32Filter `protobuf:"bytes,15,opt,name=meta_client_geo_autonomous_system_number,json=metaClientGeoAutonomousSystemNumber,proto3" json:"meta_client_geo_autonomous_system_number,omitempty"` + // Filter by meta_client_geo_autonomous_system_organization - Autonomous system organization of the client (optional) + MetaClientGeoAutonomousSystemOrganization *NullableStringFilter `protobuf:"bytes,16,opt,name=meta_client_geo_autonomous_system_organization,json=metaClientGeoAutonomousSystemOrganization,proto3" json:"meta_client_geo_autonomous_system_organization,omitempty"` + // Filter by min_slot - Minimum slot number in this day (optional) + MinSlot *UInt64Filter `protobuf:"bytes,17,opt,name=min_slot,json=minSlot,proto3" json:"min_slot,omitempty"` + // Filter by max_slot - Maximum slot number in this day (optional) + MaxSlot *UInt64Filter `protobuf:"bytes,18,opt,name=max_slot,json=maxSlot,proto3" json:"max_slot,omitempty"` + // Filter by epoch_count - Number of epochs in this day (optional) + EpochCount *UInt32Filter `protobuf:"bytes,19,opt,name=epoch_count,json=epochCount,proto3" json:"epoch_count,omitempty"` + // Filter by slot_count - Number of slots with blocks seen in this day (optional) + SlotCount *UInt32Filter `protobuf:"bytes,20,opt,name=slot_count,json=slotCount,proto3" json:"slot_count,omitempty"` + // Filter by min_seen_slot_start_diff_ms - Minimum time from slot start for the node to see a block (milliseconds) (optional) + MinSeenSlotStartDiffMs *UInt32Filter `protobuf:"bytes,21,opt,name=min_seen_slot_start_diff_ms,json=minSeenSlotStartDiffMs,proto3" json:"min_seen_slot_start_diff_ms,omitempty"` + // Filter by p05_seen_slot_start_diff_ms - 5th percentile time from slot start (milliseconds) (optional) + P05SeenSlotStartDiffMs *UInt32Filter `protobuf:"bytes,22,opt,name=p05_seen_slot_start_diff_ms,json=p05SeenSlotStartDiffMs,proto3" json:"p05_seen_slot_start_diff_ms,omitempty"` + // Filter by p50_seen_slot_start_diff_ms - Median (p50) time from slot start (milliseconds) (optional) + P50SeenSlotStartDiffMs *UInt32Filter `protobuf:"bytes,23,opt,name=p50_seen_slot_start_diff_ms,json=p50SeenSlotStartDiffMs,proto3" json:"p50_seen_slot_start_diff_ms,omitempty"` + // Filter by avg_seen_slot_start_diff_ms - Average time from slot start (milliseconds) (optional) + AvgSeenSlotStartDiffMs *UInt32Filter `protobuf:"bytes,24,opt,name=avg_seen_slot_start_diff_ms,json=avgSeenSlotStartDiffMs,proto3" json:"avg_seen_slot_start_diff_ms,omitempty"` + // Filter by p90_seen_slot_start_diff_ms - 90th percentile time from slot start (milliseconds) (optional) + P90SeenSlotStartDiffMs *UInt32Filter `protobuf:"bytes,25,opt,name=p90_seen_slot_start_diff_ms,json=p90SeenSlotStartDiffMs,proto3" json:"p90_seen_slot_start_diff_ms,omitempty"` + // Filter by p95_seen_slot_start_diff_ms - 95th percentile time from slot start (milliseconds) (optional) + P95SeenSlotStartDiffMs *UInt32Filter `protobuf:"bytes,26,opt,name=p95_seen_slot_start_diff_ms,json=p95SeenSlotStartDiffMs,proto3" json:"p95_seen_slot_start_diff_ms,omitempty"` + // Filter by p99_seen_slot_start_diff_ms - 99th percentile time from slot start (milliseconds) (optional) + P99SeenSlotStartDiffMs *UInt32Filter `protobuf:"bytes,27,opt,name=p99_seen_slot_start_diff_ms,json=p99SeenSlotStartDiffMs,proto3" json:"p99_seen_slot_start_diff_ms,omitempty"` + // Filter by max_seen_slot_start_diff_ms - Maximum time from slot start (milliseconds) (optional) + MaxSeenSlotStartDiffMs *UInt32Filter `protobuf:"bytes,28,opt,name=max_seen_slot_start_diff_ms,json=maxSeenSlotStartDiffMs,proto3" json:"max_seen_slot_start_diff_ms,omitempty"` + // The maximum number of fct_block_first_seen_by_node_daily to return. + // If unspecified, at most 100 items will be returned. + // The maximum value is 10000; values above 10000 will be coerced to 10000. + PageSize int32 `protobuf:"varint,29,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + // A page token, received from a previous `ListFctBlockFirstSeenByNodeDaily` call. + // Provide this to retrieve the subsequent page. + PageToken string `protobuf:"bytes,30,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + // The order of results. Format: comma-separated list of fields. + // Example: "foo,bar" or "foo desc,bar" for descending order on foo. + // If unspecified, results will be returned in the default order. + OrderBy string `protobuf:"bytes,31,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"` +} + +func (x *ListFctBlockFirstSeenByNodeDailyRequest) Reset() { + *x = ListFctBlockFirstSeenByNodeDailyRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_fct_block_first_seen_by_node_daily_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListFctBlockFirstSeenByNodeDailyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListFctBlockFirstSeenByNodeDailyRequest) ProtoMessage() {} + +func (x *ListFctBlockFirstSeenByNodeDailyRequest) ProtoReflect() protoreflect.Message { + mi := &file_fct_block_first_seen_by_node_daily_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListFctBlockFirstSeenByNodeDailyRequest.ProtoReflect.Descriptor instead. +func (*ListFctBlockFirstSeenByNodeDailyRequest) Descriptor() ([]byte, []int) { + return file_fct_block_first_seen_by_node_daily_proto_rawDescGZIP(), []int{1} +} + +func (x *ListFctBlockFirstSeenByNodeDailyRequest) GetDay() *StringFilter { + if x != nil { + return x.Day + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeDailyRequest) GetMetaClientName() *StringFilter { + if x != nil { + return x.MetaClientName + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeDailyRequest) GetUpdatedDateTime() *UInt32Filter { + if x != nil { + return x.UpdatedDateTime + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeDailyRequest) GetDayStartDateTime() *UInt32Filter { + if x != nil { + return x.DayStartDateTime + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeDailyRequest) GetUsername() *StringFilter { + if x != nil { + return x.Username + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeDailyRequest) GetNodeId() *StringFilter { + if x != nil { + return x.NodeId + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeDailyRequest) GetClassification() *StringFilter { + if x != nil { + return x.Classification + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeDailyRequest) GetMetaClientImplementation() *StringFilter { + if x != nil { + return x.MetaClientImplementation + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeDailyRequest) GetMetaClientGeoCity() *StringFilter { + if x != nil { + return x.MetaClientGeoCity + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeDailyRequest) GetMetaClientGeoCountry() *StringFilter { + if x != nil { + return x.MetaClientGeoCountry + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeDailyRequest) GetMetaClientGeoCountryCode() *StringFilter { + if x != nil { + return x.MetaClientGeoCountryCode + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeDailyRequest) GetMetaClientGeoContinentCode() *StringFilter { + if x != nil { + return x.MetaClientGeoContinentCode + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeDailyRequest) GetMetaClientGeoLongitude() *wrapperspb.DoubleValue { + if x != nil { + return x.MetaClientGeoLongitude + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeDailyRequest) GetMetaClientGeoLatitude() *wrapperspb.DoubleValue { + if x != nil { + return x.MetaClientGeoLatitude + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeDailyRequest) GetMetaClientGeoAutonomousSystemNumber() *NullableUInt32Filter { + if x != nil { + return x.MetaClientGeoAutonomousSystemNumber + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeDailyRequest) GetMetaClientGeoAutonomousSystemOrganization() *NullableStringFilter { + if x != nil { + return x.MetaClientGeoAutonomousSystemOrganization + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeDailyRequest) GetMinSlot() *UInt64Filter { + if x != nil { + return x.MinSlot + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeDailyRequest) GetMaxSlot() *UInt64Filter { + if x != nil { + return x.MaxSlot + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeDailyRequest) GetEpochCount() *UInt32Filter { + if x != nil { + return x.EpochCount + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeDailyRequest) GetSlotCount() *UInt32Filter { + if x != nil { + return x.SlotCount + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeDailyRequest) GetMinSeenSlotStartDiffMs() *UInt32Filter { + if x != nil { + return x.MinSeenSlotStartDiffMs + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeDailyRequest) GetP05SeenSlotStartDiffMs() *UInt32Filter { + if x != nil { + return x.P05SeenSlotStartDiffMs + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeDailyRequest) GetP50SeenSlotStartDiffMs() *UInt32Filter { + if x != nil { + return x.P50SeenSlotStartDiffMs + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeDailyRequest) GetAvgSeenSlotStartDiffMs() *UInt32Filter { + if x != nil { + return x.AvgSeenSlotStartDiffMs + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeDailyRequest) GetP90SeenSlotStartDiffMs() *UInt32Filter { + if x != nil { + return x.P90SeenSlotStartDiffMs + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeDailyRequest) GetP95SeenSlotStartDiffMs() *UInt32Filter { + if x != nil { + return x.P95SeenSlotStartDiffMs + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeDailyRequest) GetP99SeenSlotStartDiffMs() *UInt32Filter { + if x != nil { + return x.P99SeenSlotStartDiffMs + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeDailyRequest) GetMaxSeenSlotStartDiffMs() *UInt32Filter { + if x != nil { + return x.MaxSeenSlotStartDiffMs + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeDailyRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListFctBlockFirstSeenByNodeDailyRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +func (x *ListFctBlockFirstSeenByNodeDailyRequest) GetOrderBy() string { + if x != nil { + return x.OrderBy + } + return "" +} + +// Response for listing fct_block_first_seen_by_node_daily records +type ListFctBlockFirstSeenByNodeDailyResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The list of fct_block_first_seen_by_node_daily. + FctBlockFirstSeenByNodeDaily []*FctBlockFirstSeenByNodeDaily `protobuf:"bytes,1,rep,name=fct_block_first_seen_by_node_daily,json=fctBlockFirstSeenByNodeDaily,proto3" json:"fct_block_first_seen_by_node_daily,omitempty"` + // A token, which can be sent as `page_token` to retrieve the next page. + // If this field is omitted, there are no subsequent pages. + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` +} + +func (x *ListFctBlockFirstSeenByNodeDailyResponse) Reset() { + *x = ListFctBlockFirstSeenByNodeDailyResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_fct_block_first_seen_by_node_daily_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListFctBlockFirstSeenByNodeDailyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListFctBlockFirstSeenByNodeDailyResponse) ProtoMessage() {} + +func (x *ListFctBlockFirstSeenByNodeDailyResponse) ProtoReflect() protoreflect.Message { + mi := &file_fct_block_first_seen_by_node_daily_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListFctBlockFirstSeenByNodeDailyResponse.ProtoReflect.Descriptor instead. +func (*ListFctBlockFirstSeenByNodeDailyResponse) Descriptor() ([]byte, []int) { + return file_fct_block_first_seen_by_node_daily_proto_rawDescGZIP(), []int{2} +} + +func (x *ListFctBlockFirstSeenByNodeDailyResponse) GetFctBlockFirstSeenByNodeDaily() []*FctBlockFirstSeenByNodeDaily { + if x != nil { + return x.FctBlockFirstSeenByNodeDaily + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeDailyResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +// Request for getting a single fct_block_first_seen_by_node_daily record by primary key +type GetFctBlockFirstSeenByNodeDailyRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Calendar day (UTC) + Day string `protobuf:"bytes,1,opt,name=day,proto3" json:"day,omitempty"` // Primary key (required) +} + +func (x *GetFctBlockFirstSeenByNodeDailyRequest) Reset() { + *x = GetFctBlockFirstSeenByNodeDailyRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_fct_block_first_seen_by_node_daily_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetFctBlockFirstSeenByNodeDailyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetFctBlockFirstSeenByNodeDailyRequest) ProtoMessage() {} + +func (x *GetFctBlockFirstSeenByNodeDailyRequest) ProtoReflect() protoreflect.Message { + mi := &file_fct_block_first_seen_by_node_daily_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetFctBlockFirstSeenByNodeDailyRequest.ProtoReflect.Descriptor instead. +func (*GetFctBlockFirstSeenByNodeDailyRequest) Descriptor() ([]byte, []int) { + return file_fct_block_first_seen_by_node_daily_proto_rawDescGZIP(), []int{3} +} + +func (x *GetFctBlockFirstSeenByNodeDailyRequest) GetDay() string { + if x != nil { + return x.Day + } + return "" +} + +// Response for getting a single fct_block_first_seen_by_node_daily record +type GetFctBlockFirstSeenByNodeDailyResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Item *FctBlockFirstSeenByNodeDaily `protobuf:"bytes,1,opt,name=item,proto3" json:"item,omitempty"` +} + +func (x *GetFctBlockFirstSeenByNodeDailyResponse) Reset() { + *x = GetFctBlockFirstSeenByNodeDailyResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_fct_block_first_seen_by_node_daily_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetFctBlockFirstSeenByNodeDailyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetFctBlockFirstSeenByNodeDailyResponse) ProtoMessage() {} + +func (x *GetFctBlockFirstSeenByNodeDailyResponse) ProtoReflect() protoreflect.Message { + mi := &file_fct_block_first_seen_by_node_daily_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetFctBlockFirstSeenByNodeDailyResponse.ProtoReflect.Descriptor instead. +func (*GetFctBlockFirstSeenByNodeDailyResponse) Descriptor() ([]byte, []int) { + return file_fct_block_first_seen_by_node_daily_proto_rawDescGZIP(), []int{4} +} + +func (x *GetFctBlockFirstSeenByNodeDailyResponse) GetItem() *FctBlockFirstSeenByNodeDaily { + if x != nil { + return x.Item + } + return nil +} + +var File_fct_block_first_seen_by_node_daily_proto protoreflect.FileDescriptor + +var file_fct_block_first_seen_by_node_daily_proto_rawDesc = []byte{ + 0x0a, 0x28, 0x66, 0x63, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x66, 0x69, 0x72, 0x73, + 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x62, 0x79, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x64, + 0x61, 0x69, 0x6c, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x03, 0x63, 0x62, 0x74, 0x1a, + 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, + 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, + 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x63, 0x6c, + 0x69, 0x63, 0x6b, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xc0, 0x0c, 0x0a, 0x1c, 0x46, + 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x72, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, + 0x42, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x44, 0x61, 0x69, 0x6c, 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x44, + 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x61, 0x79, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x61, 0x79, 0x12, 0x2d, 0x0a, 0x13, 0x64, 0x61, 0x79, + 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x64, 0x61, 0x79, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x44, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, + 0x0e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0e, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x3c, 0x0a, 0x1a, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, + 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x12, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x18, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, + 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, + 0x14, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x65, 0x6f, + 0x5f, 0x63, 0x69, 0x74, 0x79, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x6d, 0x65, 0x74, + 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x47, 0x65, 0x6f, 0x43, 0x69, 0x74, 0x79, 0x12, 0x35, + 0x0a, 0x17, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x65, + 0x6f, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x14, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x47, 0x65, 0x6f, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x3e, 0x0a, 0x1c, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, + 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x18, 0x6d, 0x65, 0x74, + 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x47, 0x65, 0x6f, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, + 0x79, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x42, 0x0a, 0x1e, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x65, + 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1a, 0x6d, + 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x47, 0x65, 0x6f, 0x43, 0x6f, 0x6e, 0x74, + 0x69, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x57, 0x0a, 0x19, 0x6d, 0x65, 0x74, + 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x6c, 0x6f, 0x6e, + 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, + 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x16, 0x6d, 0x65, 0x74, 0x61, + 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x47, 0x65, 0x6f, 0x4c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, + 0x64, 0x65, 0x12, 0x55, 0x0a, 0x18, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x18, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x15, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x47, 0x65, + 0x6f, 0x4c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x73, 0x0a, 0x28, 0x6d, 0x65, 0x74, + 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x61, 0x75, 0x74, + 0x6f, 0x6e, 0x6f, 0x6d, 0x6f, 0x75, 0x73, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, + 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x23, 0x6d, 0x65, 0x74, 0x61, 0x43, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x47, 0x65, 0x6f, 0x41, 0x75, 0x74, 0x6f, 0x6e, 0x6f, 0x6d, 0x6f, + 0x75, 0x73, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x7f, + 0x0a, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x65, + 0x6f, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x6e, 0x6f, 0x6d, 0x6f, 0x75, 0x73, 0x5f, 0x73, 0x79, 0x73, + 0x74, 0x65, 0x6d, 0x5f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x29, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x47, 0x65, 0x6f, 0x41, 0x75, 0x74, 0x6f, 0x6e, 0x6f, 0x6d, 0x6f, 0x75, 0x73, 0x53, 0x79, 0x73, + 0x74, 0x65, 0x6d, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x19, 0x0a, 0x08, 0x6d, 0x69, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x1b, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x07, 0x6d, 0x69, 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, + 0x78, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x6d, 0x61, + 0x78, 0x53, 0x6c, 0x6f, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x65, 0x70, 0x6f, 0x63, + 0x68, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x73, 0x6c, 0x6f, 0x74, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3b, 0x0a, 0x1b, 0x6d, 0x69, 0x6e, 0x5f, 0x73, 0x65, 0x65, + 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, + 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x16, 0x6d, 0x69, 0x6e, 0x53, + 0x65, 0x65, 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x69, 0x66, 0x66, + 0x4d, 0x73, 0x12, 0x3b, 0x0a, 0x1b, 0x70, 0x30, 0x35, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, + 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, + 0x73, 0x18, 0x20, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x16, 0x70, 0x30, 0x35, 0x53, 0x65, 0x65, 0x6e, + 0x53, 0x6c, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x69, 0x66, 0x66, 0x4d, 0x73, 0x12, + 0x3b, 0x0a, 0x1b, 0x70, 0x35, 0x30, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, + 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x21, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x16, 0x70, 0x35, 0x30, 0x53, 0x65, 0x65, 0x6e, 0x53, 0x6c, 0x6f, + 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x69, 0x66, 0x66, 0x4d, 0x73, 0x12, 0x3b, 0x0a, 0x1b, + 0x61, 0x76, 0x67, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x22, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x16, 0x61, 0x76, 0x67, 0x53, 0x65, 0x65, 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x44, 0x69, 0x66, 0x66, 0x4d, 0x73, 0x12, 0x3b, 0x0a, 0x1b, 0x70, 0x39, 0x30, + 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x23, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x16, + 0x70, 0x39, 0x30, 0x53, 0x65, 0x65, 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x44, 0x69, 0x66, 0x66, 0x4d, 0x73, 0x12, 0x3b, 0x0a, 0x1b, 0x70, 0x39, 0x35, 0x5f, 0x73, 0x65, + 0x65, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, + 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x24, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x16, 0x70, 0x39, 0x35, + 0x53, 0x65, 0x65, 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x69, 0x66, + 0x66, 0x4d, 0x73, 0x12, 0x3b, 0x0a, 0x1b, 0x70, 0x39, 0x39, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, + 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, + 0x6d, 0x73, 0x18, 0x25, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x16, 0x70, 0x39, 0x39, 0x53, 0x65, 0x65, + 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x69, 0x66, 0x66, 0x4d, 0x73, + 0x12, 0x3b, 0x0a, 0x1b, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, + 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x18, + 0x26, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x16, 0x6d, 0x61, 0x78, 0x53, 0x65, 0x65, 0x6e, 0x53, 0x6c, + 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x69, 0x66, 0x66, 0x4d, 0x73, 0x22, 0x8f, 0x12, + 0x0a, 0x27, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x69, + 0x72, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x42, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x44, 0x61, 0x69, + 0x6c, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x03, 0x64, 0x61, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x12, 0xe0, 0x41, 0x02, 0x9a, 0xb5, + 0x18, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x52, 0x03, 0x64, + 0x61, 0x79, 0x12, 0x40, 0x0a, 0x10, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, + 0x62, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, + 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0e, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x42, 0x0a, 0x11, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, + 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x44, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x13, 0x64, 0x61, 0x79, 0x5f, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x55, 0x49, 0x6e, 0x74, + 0x33, 0x32, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x10, 0x64, + 0x61, 0x79, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, + 0x32, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x06, 0x6e, 0x6f, + 0x64, 0x65, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x0e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, + 0x62, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, + 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x54, 0x0a, 0x1a, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x53, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, + 0x52, 0x18, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6d, 0x70, 0x6c, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x47, 0x0a, 0x14, 0x6d, 0x65, + 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x63, 0x69, + 0x74, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x53, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, + 0x52, 0x11, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x47, 0x65, 0x6f, 0x43, + 0x69, 0x74, 0x79, 0x12, 0x4d, 0x0a, 0x17, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x14, 0x6d, 0x65, + 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x47, 0x65, 0x6f, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x56, 0x0a, 0x1c, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x63, 0x6f, + 0x64, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x53, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, + 0x52, 0x18, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x47, 0x65, 0x6f, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x5a, 0x0a, 0x1e, 0x6d, 0x65, + 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x69, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x1a, 0x6d, 0x65, 0x74, 0x61, + 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x47, 0x65, 0x6f, 0x43, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x65, + 0x6e, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x5c, 0x0a, 0x19, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, + 0x75, 0x64, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x6f, 0x75, 0x62, + 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x16, 0x6d, 0x65, + 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x47, 0x65, 0x6f, 0x4c, 0x6f, 0x6e, 0x67, 0x69, + 0x74, 0x75, 0x64, 0x65, 0x12, 0x5a, 0x0a, 0x18, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, + 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x15, 0x6d, 0x65, 0x74, 0x61, 0x43, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x47, 0x65, 0x6f, 0x4c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, + 0x12, 0x75, 0x0a, 0x28, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, + 0x67, 0x65, 0x6f, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x6e, 0x6f, 0x6d, 0x6f, 0x75, 0x73, 0x5f, 0x73, + 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x0f, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, + 0x41, 0x01, 0x52, 0x23, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x47, 0x65, + 0x6f, 0x41, 0x75, 0x74, 0x6f, 0x6e, 0x6f, 0x6d, 0x6f, 0x75, 0x73, 0x53, 0x79, 0x73, 0x74, 0x65, + 0x6d, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x81, 0x01, 0x0a, 0x2e, 0x6d, 0x65, 0x74, 0x61, + 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x61, 0x75, 0x74, 0x6f, + 0x6e, 0x6f, 0x6d, 0x6f, 0x75, 0x73, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x6f, 0x72, + 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, + 0x52, 0x29, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x47, 0x65, 0x6f, 0x41, + 0x75, 0x74, 0x6f, 0x6e, 0x6f, 0x6d, 0x6f, 0x75, 0x73, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4f, + 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x0a, 0x08, 0x6d, + 0x69, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, + 0x63, 0x62, 0x74, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x07, 0x6d, 0x69, 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x12, 0x31, + 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x53, 0x6c, 0x6f, + 0x74, 0x12, 0x37, 0x0a, 0x0b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x55, 0x49, 0x6e, + 0x74, 0x33, 0x32, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0a, + 0x65, 0x70, 0x6f, 0x63, 0x68, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x35, 0x0a, 0x0a, 0x73, 0x6c, + 0x6f, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, + 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x73, 0x6c, 0x6f, 0x74, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x53, 0x0a, 0x1b, 0x6d, 0x69, 0x6e, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, 0x6c, + 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, + 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x55, 0x49, 0x6e, + 0x74, 0x33, 0x32, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x16, + 0x6d, 0x69, 0x6e, 0x53, 0x65, 0x65, 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x44, 0x69, 0x66, 0x66, 0x4d, 0x73, 0x12, 0x53, 0x0a, 0x1b, 0x70, 0x30, 0x35, 0x5f, 0x73, 0x65, + 0x65, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, + 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, + 0x74, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, + 0xe0, 0x41, 0x01, 0x52, 0x16, 0x70, 0x30, 0x35, 0x53, 0x65, 0x65, 0x6e, 0x53, 0x6c, 0x6f, 0x74, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x69, 0x66, 0x66, 0x4d, 0x73, 0x12, 0x53, 0x0a, 0x1b, 0x70, + 0x35, 0x30, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x16, 0x70, 0x35, 0x30, 0x53, 0x65, 0x65, + 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x69, 0x66, 0x66, 0x4d, 0x73, + 0x12, 0x53, 0x0a, 0x1b, 0x61, 0x76, 0x67, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, + 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x18, + 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x55, 0x49, 0x6e, 0x74, + 0x33, 0x32, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x16, 0x61, + 0x76, 0x67, 0x53, 0x65, 0x65, 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, + 0x69, 0x66, 0x66, 0x4d, 0x73, 0x12, 0x53, 0x0a, 0x1b, 0x70, 0x39, 0x30, 0x5f, 0x73, 0x65, 0x65, + 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, + 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, + 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, + 0x41, 0x01, 0x52, 0x16, 0x70, 0x39, 0x30, 0x53, 0x65, 0x65, 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x44, 0x69, 0x66, 0x66, 0x4d, 0x73, 0x12, 0x53, 0x0a, 0x1b, 0x70, 0x39, + 0x35, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x16, 0x70, 0x39, 0x35, 0x53, 0x65, 0x65, 0x6e, + 0x53, 0x6c, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x69, 0x66, 0x66, 0x4d, 0x73, 0x12, + 0x53, 0x0a, 0x1b, 0x70, 0x39, 0x39, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, + 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x1b, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, + 0x32, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x16, 0x70, 0x39, + 0x39, 0x53, 0x65, 0x65, 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x69, + 0x66, 0x66, 0x4d, 0x73, 0x12, 0x53, 0x0a, 0x1b, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x65, 0x65, 0x6e, + 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, + 0x5f, 0x6d, 0x73, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, + 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, + 0x01, 0x52, 0x16, 0x6d, 0x61, 0x78, 0x53, 0x65, 0x65, 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x44, 0x69, 0x66, 0x66, 0x4d, 0x73, 0x12, 0x20, 0x0a, 0x09, 0x70, 0x61, 0x67, + 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x05, 0x42, 0x03, 0xe0, 0x41, + 0x01, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0a, 0x70, + 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, + 0x1e, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x62, 0x79, 0x18, 0x1f, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x22, + 0xbf, 0x01, 0x0a, 0x28, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x46, 0x69, 0x72, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x42, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x44, + 0x61, 0x69, 0x6c, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6b, 0x0a, 0x22, + 0x66, 0x63, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, + 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x62, 0x79, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x64, 0x61, 0x69, + 0x6c, 0x79, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x46, + 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x72, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, + 0x42, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x44, 0x61, 0x69, 0x6c, 0x79, 0x52, 0x1c, 0x66, 0x63, 0x74, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x72, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x42, 0x79, + 0x4e, 0x6f, 0x64, 0x65, 0x44, 0x61, 0x69, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, + 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x22, 0x3a, 0x0a, 0x26, 0x47, 0x65, 0x74, 0x46, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x46, 0x69, 0x72, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x42, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x44, + 0x61, 0x69, 0x6c, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x64, + 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x61, 0x79, 0x22, 0x60, 0x0a, + 0x27, 0x47, 0x65, 0x74, 0x46, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x72, 0x73, + 0x74, 0x53, 0x65, 0x65, 0x6e, 0x42, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x44, 0x61, 0x69, 0x6c, 0x79, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x04, 0x69, 0x74, 0x65, 0x6d, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x46, 0x63, 0x74, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x72, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x42, 0x79, + 0x4e, 0x6f, 0x64, 0x65, 0x44, 0x61, 0x69, 0x6c, 0x79, 0x52, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x32, + 0xdc, 0x02, 0x0a, 0x23, 0x46, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x72, 0x73, + 0x74, 0x53, 0x65, 0x65, 0x6e, 0x42, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x44, 0x61, 0x69, 0x6c, 0x79, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x97, 0x01, 0x0a, 0x04, 0x4c, 0x69, 0x73, 0x74, + 0x12, 0x2c, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x63, 0x74, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x72, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x42, 0x79, 0x4e, 0x6f, + 0x64, 0x65, 0x44, 0x61, 0x69, 0x6c, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, + 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x46, 0x69, 0x72, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x42, 0x79, 0x4e, 0x6f, 0x64, 0x65, + 0x44, 0x61, 0x69, 0x6c, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x12, 0x2a, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x66, + 0x63, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x73, + 0x65, 0x65, 0x6e, 0x5f, 0x62, 0x79, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x64, 0x61, 0x69, 0x6c, + 0x79, 0x12, 0x9a, 0x01, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x2b, 0x2e, 0x63, 0x62, 0x74, 0x2e, + 0x47, 0x65, 0x74, 0x46, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x72, 0x73, 0x74, + 0x53, 0x65, 0x65, 0x6e, 0x42, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x44, 0x61, 0x69, 0x6c, 0x79, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x47, 0x65, 0x74, + 0x46, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x72, 0x73, 0x74, 0x53, 0x65, 0x65, + 0x6e, 0x42, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x44, 0x61, 0x69, 0x6c, 0x79, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x38, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x32, 0x12, 0x30, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x66, 0x63, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, + 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x62, 0x79, 0x5f, 0x6e, 0x6f, + 0x64, 0x65, 0x5f, 0x64, 0x61, 0x69, 0x6c, 0x79, 0x2f, 0x7b, 0x64, 0x61, 0x79, 0x7d, 0x42, 0x36, + 0x5a, 0x34, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x74, 0x68, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x6f, 0x70, 0x73, 0x2f, 0x78, 0x61, 0x74, 0x75, 0x2d, 0x63, 0x62, + 0x74, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6c, 0x69, 0x63, + 0x6b, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_fct_block_first_seen_by_node_daily_proto_rawDescOnce sync.Once + file_fct_block_first_seen_by_node_daily_proto_rawDescData = file_fct_block_first_seen_by_node_daily_proto_rawDesc +) + +func file_fct_block_first_seen_by_node_daily_proto_rawDescGZIP() []byte { + file_fct_block_first_seen_by_node_daily_proto_rawDescOnce.Do(func() { + file_fct_block_first_seen_by_node_daily_proto_rawDescData = protoimpl.X.CompressGZIP(file_fct_block_first_seen_by_node_daily_proto_rawDescData) + }) + return file_fct_block_first_seen_by_node_daily_proto_rawDescData +} + +var file_fct_block_first_seen_by_node_daily_proto_msgTypes = make([]protoimpl.MessageInfo, 5) +var file_fct_block_first_seen_by_node_daily_proto_goTypes = []any{ + (*FctBlockFirstSeenByNodeDaily)(nil), // 0: cbt.FctBlockFirstSeenByNodeDaily + (*ListFctBlockFirstSeenByNodeDailyRequest)(nil), // 1: cbt.ListFctBlockFirstSeenByNodeDailyRequest + (*ListFctBlockFirstSeenByNodeDailyResponse)(nil), // 2: cbt.ListFctBlockFirstSeenByNodeDailyResponse + (*GetFctBlockFirstSeenByNodeDailyRequest)(nil), // 3: cbt.GetFctBlockFirstSeenByNodeDailyRequest + (*GetFctBlockFirstSeenByNodeDailyResponse)(nil), // 4: cbt.GetFctBlockFirstSeenByNodeDailyResponse + (*wrapperspb.DoubleValue)(nil), // 5: google.protobuf.DoubleValue + (*wrapperspb.UInt32Value)(nil), // 6: google.protobuf.UInt32Value + (*wrapperspb.StringValue)(nil), // 7: google.protobuf.StringValue + (*StringFilter)(nil), // 8: cbt.StringFilter + (*UInt32Filter)(nil), // 9: cbt.UInt32Filter + (*NullableUInt32Filter)(nil), // 10: cbt.NullableUInt32Filter + (*NullableStringFilter)(nil), // 11: cbt.NullableStringFilter + (*UInt64Filter)(nil), // 12: cbt.UInt64Filter +} +var file_fct_block_first_seen_by_node_daily_proto_depIdxs = []int32{ + 5, // 0: cbt.FctBlockFirstSeenByNodeDaily.meta_client_geo_longitude:type_name -> google.protobuf.DoubleValue + 5, // 1: cbt.FctBlockFirstSeenByNodeDaily.meta_client_geo_latitude:type_name -> google.protobuf.DoubleValue + 6, // 2: cbt.FctBlockFirstSeenByNodeDaily.meta_client_geo_autonomous_system_number:type_name -> google.protobuf.UInt32Value + 7, // 3: cbt.FctBlockFirstSeenByNodeDaily.meta_client_geo_autonomous_system_organization:type_name -> google.protobuf.StringValue + 8, // 4: cbt.ListFctBlockFirstSeenByNodeDailyRequest.day:type_name -> cbt.StringFilter + 8, // 5: cbt.ListFctBlockFirstSeenByNodeDailyRequest.meta_client_name:type_name -> cbt.StringFilter + 9, // 6: cbt.ListFctBlockFirstSeenByNodeDailyRequest.updated_date_time:type_name -> cbt.UInt32Filter + 9, // 7: cbt.ListFctBlockFirstSeenByNodeDailyRequest.day_start_date_time:type_name -> cbt.UInt32Filter + 8, // 8: cbt.ListFctBlockFirstSeenByNodeDailyRequest.username:type_name -> cbt.StringFilter + 8, // 9: cbt.ListFctBlockFirstSeenByNodeDailyRequest.node_id:type_name -> cbt.StringFilter + 8, // 10: cbt.ListFctBlockFirstSeenByNodeDailyRequest.classification:type_name -> cbt.StringFilter + 8, // 11: cbt.ListFctBlockFirstSeenByNodeDailyRequest.meta_client_implementation:type_name -> cbt.StringFilter + 8, // 12: cbt.ListFctBlockFirstSeenByNodeDailyRequest.meta_client_geo_city:type_name -> cbt.StringFilter + 8, // 13: cbt.ListFctBlockFirstSeenByNodeDailyRequest.meta_client_geo_country:type_name -> cbt.StringFilter + 8, // 14: cbt.ListFctBlockFirstSeenByNodeDailyRequest.meta_client_geo_country_code:type_name -> cbt.StringFilter + 8, // 15: cbt.ListFctBlockFirstSeenByNodeDailyRequest.meta_client_geo_continent_code:type_name -> cbt.StringFilter + 5, // 16: cbt.ListFctBlockFirstSeenByNodeDailyRequest.meta_client_geo_longitude:type_name -> google.protobuf.DoubleValue + 5, // 17: cbt.ListFctBlockFirstSeenByNodeDailyRequest.meta_client_geo_latitude:type_name -> google.protobuf.DoubleValue + 10, // 18: cbt.ListFctBlockFirstSeenByNodeDailyRequest.meta_client_geo_autonomous_system_number:type_name -> cbt.NullableUInt32Filter + 11, // 19: cbt.ListFctBlockFirstSeenByNodeDailyRequest.meta_client_geo_autonomous_system_organization:type_name -> cbt.NullableStringFilter + 12, // 20: cbt.ListFctBlockFirstSeenByNodeDailyRequest.min_slot:type_name -> cbt.UInt64Filter + 12, // 21: cbt.ListFctBlockFirstSeenByNodeDailyRequest.max_slot:type_name -> cbt.UInt64Filter + 9, // 22: cbt.ListFctBlockFirstSeenByNodeDailyRequest.epoch_count:type_name -> cbt.UInt32Filter + 9, // 23: cbt.ListFctBlockFirstSeenByNodeDailyRequest.slot_count:type_name -> cbt.UInt32Filter + 9, // 24: cbt.ListFctBlockFirstSeenByNodeDailyRequest.min_seen_slot_start_diff_ms:type_name -> cbt.UInt32Filter + 9, // 25: cbt.ListFctBlockFirstSeenByNodeDailyRequest.p05_seen_slot_start_diff_ms:type_name -> cbt.UInt32Filter + 9, // 26: cbt.ListFctBlockFirstSeenByNodeDailyRequest.p50_seen_slot_start_diff_ms:type_name -> cbt.UInt32Filter + 9, // 27: cbt.ListFctBlockFirstSeenByNodeDailyRequest.avg_seen_slot_start_diff_ms:type_name -> cbt.UInt32Filter + 9, // 28: cbt.ListFctBlockFirstSeenByNodeDailyRequest.p90_seen_slot_start_diff_ms:type_name -> cbt.UInt32Filter + 9, // 29: cbt.ListFctBlockFirstSeenByNodeDailyRequest.p95_seen_slot_start_diff_ms:type_name -> cbt.UInt32Filter + 9, // 30: cbt.ListFctBlockFirstSeenByNodeDailyRequest.p99_seen_slot_start_diff_ms:type_name -> cbt.UInt32Filter + 9, // 31: cbt.ListFctBlockFirstSeenByNodeDailyRequest.max_seen_slot_start_diff_ms:type_name -> cbt.UInt32Filter + 0, // 32: cbt.ListFctBlockFirstSeenByNodeDailyResponse.fct_block_first_seen_by_node_daily:type_name -> cbt.FctBlockFirstSeenByNodeDaily + 0, // 33: cbt.GetFctBlockFirstSeenByNodeDailyResponse.item:type_name -> cbt.FctBlockFirstSeenByNodeDaily + 1, // 34: cbt.FctBlockFirstSeenByNodeDailyService.List:input_type -> cbt.ListFctBlockFirstSeenByNodeDailyRequest + 3, // 35: cbt.FctBlockFirstSeenByNodeDailyService.Get:input_type -> cbt.GetFctBlockFirstSeenByNodeDailyRequest + 2, // 36: cbt.FctBlockFirstSeenByNodeDailyService.List:output_type -> cbt.ListFctBlockFirstSeenByNodeDailyResponse + 4, // 37: cbt.FctBlockFirstSeenByNodeDailyService.Get:output_type -> cbt.GetFctBlockFirstSeenByNodeDailyResponse + 36, // [36:38] is the sub-list for method output_type + 34, // [34:36] is the sub-list for method input_type + 34, // [34:34] is the sub-list for extension type_name + 34, // [34:34] is the sub-list for extension extendee + 0, // [0:34] is the sub-list for field type_name +} + +func init() { file_fct_block_first_seen_by_node_daily_proto_init() } +func file_fct_block_first_seen_by_node_daily_proto_init() { + if File_fct_block_first_seen_by_node_daily_proto != nil { + return + } + file_common_proto_init() + if !protoimpl.UnsafeEnabled { + file_fct_block_first_seen_by_node_daily_proto_msgTypes[0].Exporter = func(v any, i int) any { + switch v := v.(*FctBlockFirstSeenByNodeDaily); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_fct_block_first_seen_by_node_daily_proto_msgTypes[1].Exporter = func(v any, i int) any { + switch v := v.(*ListFctBlockFirstSeenByNodeDailyRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_fct_block_first_seen_by_node_daily_proto_msgTypes[2].Exporter = func(v any, i int) any { + switch v := v.(*ListFctBlockFirstSeenByNodeDailyResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_fct_block_first_seen_by_node_daily_proto_msgTypes[3].Exporter = func(v any, i int) any { + switch v := v.(*GetFctBlockFirstSeenByNodeDailyRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_fct_block_first_seen_by_node_daily_proto_msgTypes[4].Exporter = func(v any, i int) any { + switch v := v.(*GetFctBlockFirstSeenByNodeDailyResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_fct_block_first_seen_by_node_daily_proto_rawDesc, + NumEnums: 0, + NumMessages: 5, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_fct_block_first_seen_by_node_daily_proto_goTypes, + DependencyIndexes: file_fct_block_first_seen_by_node_daily_proto_depIdxs, + MessageInfos: file_fct_block_first_seen_by_node_daily_proto_msgTypes, + }.Build() + File_fct_block_first_seen_by_node_daily_proto = out.File + file_fct_block_first_seen_by_node_daily_proto_rawDesc = nil + file_fct_block_first_seen_by_node_daily_proto_goTypes = nil + file_fct_block_first_seen_by_node_daily_proto_depIdxs = nil +} diff --git a/pkg/proto/clickhouse/fct_block_first_seen_by_node_daily.proto b/pkg/proto/clickhouse/fct_block_first_seen_by_node_daily.proto new file mode 100644 index 00000000..ad4dd04c --- /dev/null +++ b/pkg/proto/clickhouse/fct_block_first_seen_by_node_daily.proto @@ -0,0 +1,181 @@ +syntax = "proto3"; + +package cbt; + +import "common.proto"; +import "google/protobuf/wrappers.proto"; +import "google/api/annotations.proto"; +import "google/api/field_behavior.proto"; +import "clickhouse/annotations.proto"; + +option go_package = "github.com/ethpandaops/xatu-cbt/pkg/proto/clickhouse"; +// Block first seen statistics by node aggregated by day + +message FctBlockFirstSeenByNodeDaily { + // Timestamp when the record was last updated + uint32 updated_date_time = 11; + // Calendar day (UTC) + string day = 12; + // Start of day at midnight UTC + uint32 day_start_date_time = 13; + // Username of the node + string username = 14; + // ID of the node + string node_id = 15; + // Classification of the node, e.g. "individual", "corporate", "internal" (aka ethPandaOps) or "unclassified" + string classification = 16; + // Name of the client + string meta_client_name = 17; + // Implementation of the client + string meta_client_implementation = 18; + // City of the client + string meta_client_geo_city = 19; + // Country of the client + string meta_client_geo_country = 20; + // Country code of the client + string meta_client_geo_country_code = 21; + // Continent code of the client + string meta_client_geo_continent_code = 22; + // Longitude of the client + google.protobuf.DoubleValue meta_client_geo_longitude = 23; + // Latitude of the client + google.protobuf.DoubleValue meta_client_geo_latitude = 24; + // Autonomous system number of the client + google.protobuf.UInt32Value meta_client_geo_autonomous_system_number = 25; + // Autonomous system organization of the client + google.protobuf.StringValue meta_client_geo_autonomous_system_organization = 26; + // Minimum slot number in this day + uint64 min_slot = 27; + // Maximum slot number in this day + uint64 max_slot = 28; + // Number of epochs in this day + uint32 epoch_count = 29; + // Number of slots with blocks seen in this day + uint32 slot_count = 30; + // Minimum time from slot start for the node to see a block (milliseconds) + uint32 min_seen_slot_start_diff_ms = 31; + // 5th percentile time from slot start (milliseconds) + uint32 p05_seen_slot_start_diff_ms = 32; + // Median (p50) time from slot start (milliseconds) + uint32 p50_seen_slot_start_diff_ms = 33; + // Average time from slot start (milliseconds) + uint32 avg_seen_slot_start_diff_ms = 34; + // 90th percentile time from slot start (milliseconds) + uint32 p90_seen_slot_start_diff_ms = 35; + // 95th percentile time from slot start (milliseconds) + uint32 p95_seen_slot_start_diff_ms = 36; + // 99th percentile time from slot start (milliseconds) + uint32 p99_seen_slot_start_diff_ms = 37; + // Maximum time from slot start (milliseconds) + uint32 max_seen_slot_start_diff_ms = 38; +} + +// Request for listing fct_block_first_seen_by_node_daily records +message ListFctBlockFirstSeenByNodeDailyRequest { + // Filter by day - Calendar day (UTC) (PRIMARY KEY - required) + StringFilter day = 1 [(google.api.field_behavior) = REQUIRED, (clickhouse.v1.required_group) = "primary_key"]; + + // Filter by meta_client_name - Name of the client (ORDER BY column 2 - optional) + StringFilter meta_client_name = 2 [(google.api.field_behavior) = OPTIONAL]; + + // Filter by updated_date_time - Timestamp when the record was last updated (optional) + UInt32Filter updated_date_time = 3 [(google.api.field_behavior) = OPTIONAL]; + // Filter by day_start_date_time - Start of day at midnight UTC (optional) + UInt32Filter day_start_date_time = 4 [(google.api.field_behavior) = OPTIONAL]; + // Filter by username - Username of the node (optional) + StringFilter username = 5 [(google.api.field_behavior) = OPTIONAL]; + // Filter by node_id - ID of the node (optional) + StringFilter node_id = 6 [(google.api.field_behavior) = OPTIONAL]; + // Filter by classification - Classification of the node, e.g. "individual", "corporate", "internal" (aka ethPandaOps) or "unclassified" (optional) + StringFilter classification = 7 [(google.api.field_behavior) = OPTIONAL]; + // Filter by meta_client_implementation - Implementation of the client (optional) + StringFilter meta_client_implementation = 8 [(google.api.field_behavior) = OPTIONAL]; + // Filter by meta_client_geo_city - City of the client (optional) + StringFilter meta_client_geo_city = 9 [(google.api.field_behavior) = OPTIONAL]; + // Filter by meta_client_geo_country - Country of the client (optional) + StringFilter meta_client_geo_country = 10 [(google.api.field_behavior) = OPTIONAL]; + // Filter by meta_client_geo_country_code - Country code of the client (optional) + StringFilter meta_client_geo_country_code = 11 [(google.api.field_behavior) = OPTIONAL]; + // Filter by meta_client_geo_continent_code - Continent code of the client (optional) + StringFilter meta_client_geo_continent_code = 12 [(google.api.field_behavior) = OPTIONAL]; + // Filter by meta_client_geo_longitude - Longitude of the client (optional) + google.protobuf.DoubleValue meta_client_geo_longitude = 13 [(google.api.field_behavior) = OPTIONAL]; + // Filter by meta_client_geo_latitude - Latitude of the client (optional) + google.protobuf.DoubleValue meta_client_geo_latitude = 14 [(google.api.field_behavior) = OPTIONAL]; + // Filter by meta_client_geo_autonomous_system_number - Autonomous system number of the client (optional) + NullableUInt32Filter meta_client_geo_autonomous_system_number = 15 [(google.api.field_behavior) = OPTIONAL]; + // Filter by meta_client_geo_autonomous_system_organization - Autonomous system organization of the client (optional) + NullableStringFilter meta_client_geo_autonomous_system_organization = 16 [(google.api.field_behavior) = OPTIONAL]; + // Filter by min_slot - Minimum slot number in this day (optional) + UInt64Filter min_slot = 17 [(google.api.field_behavior) = OPTIONAL]; + // Filter by max_slot - Maximum slot number in this day (optional) + UInt64Filter max_slot = 18 [(google.api.field_behavior) = OPTIONAL]; + // Filter by epoch_count - Number of epochs in this day (optional) + UInt32Filter epoch_count = 19 [(google.api.field_behavior) = OPTIONAL]; + // Filter by slot_count - Number of slots with blocks seen in this day (optional) + UInt32Filter slot_count = 20 [(google.api.field_behavior) = OPTIONAL]; + // Filter by min_seen_slot_start_diff_ms - Minimum time from slot start for the node to see a block (milliseconds) (optional) + UInt32Filter min_seen_slot_start_diff_ms = 21 [(google.api.field_behavior) = OPTIONAL]; + // Filter by p05_seen_slot_start_diff_ms - 5th percentile time from slot start (milliseconds) (optional) + UInt32Filter p05_seen_slot_start_diff_ms = 22 [(google.api.field_behavior) = OPTIONAL]; + // Filter by p50_seen_slot_start_diff_ms - Median (p50) time from slot start (milliseconds) (optional) + UInt32Filter p50_seen_slot_start_diff_ms = 23 [(google.api.field_behavior) = OPTIONAL]; + // Filter by avg_seen_slot_start_diff_ms - Average time from slot start (milliseconds) (optional) + UInt32Filter avg_seen_slot_start_diff_ms = 24 [(google.api.field_behavior) = OPTIONAL]; + // Filter by p90_seen_slot_start_diff_ms - 90th percentile time from slot start (milliseconds) (optional) + UInt32Filter p90_seen_slot_start_diff_ms = 25 [(google.api.field_behavior) = OPTIONAL]; + // Filter by p95_seen_slot_start_diff_ms - 95th percentile time from slot start (milliseconds) (optional) + UInt32Filter p95_seen_slot_start_diff_ms = 26 [(google.api.field_behavior) = OPTIONAL]; + // Filter by p99_seen_slot_start_diff_ms - 99th percentile time from slot start (milliseconds) (optional) + UInt32Filter p99_seen_slot_start_diff_ms = 27 [(google.api.field_behavior) = OPTIONAL]; + // Filter by max_seen_slot_start_diff_ms - Maximum time from slot start (milliseconds) (optional) + UInt32Filter max_seen_slot_start_diff_ms = 28 [(google.api.field_behavior) = OPTIONAL]; + + // The maximum number of fct_block_first_seen_by_node_daily to return. + // If unspecified, at most 100 items will be returned. + // The maximum value is 10000; values above 10000 will be coerced to 10000. + int32 page_size = 29 [(google.api.field_behavior) = OPTIONAL]; + // A page token, received from a previous `ListFctBlockFirstSeenByNodeDaily` call. + // Provide this to retrieve the subsequent page. + string page_token = 30 [(google.api.field_behavior) = OPTIONAL]; + // The order of results. Format: comma-separated list of fields. + // Example: "foo,bar" or "foo desc,bar" for descending order on foo. + // If unspecified, results will be returned in the default order. + string order_by = 31 [(google.api.field_behavior) = OPTIONAL]; +} + +// Response for listing fct_block_first_seen_by_node_daily records +message ListFctBlockFirstSeenByNodeDailyResponse { + // The list of fct_block_first_seen_by_node_daily. + repeated FctBlockFirstSeenByNodeDaily fct_block_first_seen_by_node_daily = 1; + // A token, which can be sent as `page_token` to retrieve the next page. + // If this field is omitted, there are no subsequent pages. + string next_page_token = 2; +} + +// Request for getting a single fct_block_first_seen_by_node_daily record by primary key +message GetFctBlockFirstSeenByNodeDailyRequest { + // Calendar day (UTC) + string day = 1; // Primary key (required) +} + +// Response for getting a single fct_block_first_seen_by_node_daily record +message GetFctBlockFirstSeenByNodeDailyResponse { + FctBlockFirstSeenByNodeDaily item = 1; +} + +// Query fct_block_first_seen_by_node_daily data +service FctBlockFirstSeenByNodeDailyService { + // List records | Retrieve paginated results with optional filtering + rpc List(ListFctBlockFirstSeenByNodeDailyRequest) returns (ListFctBlockFirstSeenByNodeDailyResponse) { + option (google.api.http) = { + get: "/api/v1/fct_block_first_seen_by_node_daily" + }; + } + // Get record | Retrieve a single record by day + rpc Get(GetFctBlockFirstSeenByNodeDailyRequest) returns (GetFctBlockFirstSeenByNodeDailyResponse) { + option (google.api.http) = { + get: "/api/v1/fct_block_first_seen_by_node_daily/{day}" + }; + } +} diff --git a/pkg/proto/clickhouse/fct_block_first_seen_by_node_monthly.go b/pkg/proto/clickhouse/fct_block_first_seen_by_node_monthly.go new file mode 100644 index 00000000..49906ad9 --- /dev/null +++ b/pkg/proto/clickhouse/fct_block_first_seen_by_node_monthly.go @@ -0,0 +1,923 @@ +// Code generated by clickhouse-proto-gen. DO NOT EDIT. +// SQL query builder for fct_block_first_seen_by_node_monthly + +package clickhouse + +import ( + "fmt" +) + +// BuildListFctBlockFirstSeenByNodeMonthlyQuery constructs a parameterized SQL query from a ListFctBlockFirstSeenByNodeMonthlyRequest +// +// Available projections: +// - p_by_month_node (primary key: month) +// +// Use WithProjection() option to select a specific projection. +func BuildListFctBlockFirstSeenByNodeMonthlyQuery(req *ListFctBlockFirstSeenByNodeMonthlyRequest, options ...QueryOption) (SQLQuery, error) { + // Validate that at least one primary key is provided + // Primary keys can come from base table or projections + if req.Month == nil { + return SQLQuery{}, fmt.Errorf("primary key field month is required") + } + + // Build query using QueryBuilder + qb := NewQueryBuilder() + + // Add primary key filter + switch filter := req.Month.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("month", "=", filter.Eq) + case *UInt32Filter_Ne: + qb.AddCondition("month", "!=", filter.Ne) + case *UInt32Filter_Lt: + qb.AddCondition("month", "<", filter.Lt) + case *UInt32Filter_Lte: + qb.AddCondition("month", "<=", filter.Lte) + case *UInt32Filter_Gt: + qb.AddCondition("month", ">", filter.Gt) + case *UInt32Filter_Gte: + qb.AddCondition("month", ">=", filter.Gte) + case *UInt32Filter_Between: + qb.AddBetweenCondition("month", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("month", UInt32SliceToInterface(filter.In.Values)) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("month", UInt32SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + + // Add filter for column: updated_date_time + if req.UpdatedDateTime != nil { + switch filter := req.UpdatedDateTime.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("updated_date_time", "=", DateTimeValue{filter.Eq}) + case *UInt32Filter_Ne: + qb.AddCondition("updated_date_time", "!=", DateTimeValue{filter.Ne}) + case *UInt32Filter_Lt: + qb.AddCondition("updated_date_time", "<", DateTimeValue{filter.Lt}) + case *UInt32Filter_Lte: + qb.AddCondition("updated_date_time", "<=", DateTimeValue{filter.Lte}) + case *UInt32Filter_Gt: + qb.AddCondition("updated_date_time", ">", DateTimeValue{filter.Gt}) + case *UInt32Filter_Gte: + qb.AddCondition("updated_date_time", ">=", DateTimeValue{filter.Gte}) + case *UInt32Filter_Between: + qb.AddBetweenCondition("updated_date_time", DateTimeValue{filter.Between.Min}, DateTimeValue{filter.Between.Max.GetValue()}) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + converted := make([]interface{}, len(filter.In.Values)) + for i, v := range filter.In.Values { + converted[i] = DateTimeValue{v} + } + qb.AddInCondition("updated_date_time", converted) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + converted := make([]interface{}, len(filter.NotIn.Values)) + for i, v := range filter.NotIn.Values { + converted[i] = DateTimeValue{v} + } + qb.AddNotInCondition("updated_date_time", converted) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: month_start_date_time + if req.MonthStartDateTime != nil { + switch filter := req.MonthStartDateTime.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("month_start_date_time", "=", DateTimeValue{filter.Eq}) + case *UInt32Filter_Ne: + qb.AddCondition("month_start_date_time", "!=", DateTimeValue{filter.Ne}) + case *UInt32Filter_Lt: + qb.AddCondition("month_start_date_time", "<", DateTimeValue{filter.Lt}) + case *UInt32Filter_Lte: + qb.AddCondition("month_start_date_time", "<=", DateTimeValue{filter.Lte}) + case *UInt32Filter_Gt: + qb.AddCondition("month_start_date_time", ">", DateTimeValue{filter.Gt}) + case *UInt32Filter_Gte: + qb.AddCondition("month_start_date_time", ">=", DateTimeValue{filter.Gte}) + case *UInt32Filter_Between: + qb.AddBetweenCondition("month_start_date_time", DateTimeValue{filter.Between.Min}, DateTimeValue{filter.Between.Max.GetValue()}) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + converted := make([]interface{}, len(filter.In.Values)) + for i, v := range filter.In.Values { + converted[i] = DateTimeValue{v} + } + qb.AddInCondition("month_start_date_time", converted) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + converted := make([]interface{}, len(filter.NotIn.Values)) + for i, v := range filter.NotIn.Values { + converted[i] = DateTimeValue{v} + } + qb.AddNotInCondition("month_start_date_time", converted) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: username + if req.Username != nil { + switch filter := req.Username.Filter.(type) { + case *StringFilter_Eq: + qb.AddCondition("username", "=", filter.Eq) + case *StringFilter_Ne: + qb.AddCondition("username", "!=", filter.Ne) + case *StringFilter_Contains: + qb.AddLikeCondition("username", "%" + filter.Contains + "%") + case *StringFilter_StartsWith: + qb.AddLikeCondition("username", filter.StartsWith + "%") + case *StringFilter_EndsWith: + qb.AddLikeCondition("username", "%" + filter.EndsWith) + case *StringFilter_Like: + qb.AddLikeCondition("username", filter.Like) + case *StringFilter_NotLike: + qb.AddNotLikeCondition("username", filter.NotLike) + case *StringFilter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("username", StringSliceToInterface(filter.In.Values)) + } + case *StringFilter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("username", StringSliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: node_id + if req.NodeId != nil { + switch filter := req.NodeId.Filter.(type) { + case *StringFilter_Eq: + qb.AddCondition("node_id", "=", filter.Eq) + case *StringFilter_Ne: + qb.AddCondition("node_id", "!=", filter.Ne) + case *StringFilter_Contains: + qb.AddLikeCondition("node_id", "%" + filter.Contains + "%") + case *StringFilter_StartsWith: + qb.AddLikeCondition("node_id", filter.StartsWith + "%") + case *StringFilter_EndsWith: + qb.AddLikeCondition("node_id", "%" + filter.EndsWith) + case *StringFilter_Like: + qb.AddLikeCondition("node_id", filter.Like) + case *StringFilter_NotLike: + qb.AddNotLikeCondition("node_id", filter.NotLike) + case *StringFilter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("node_id", StringSliceToInterface(filter.In.Values)) + } + case *StringFilter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("node_id", StringSliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: classification + if req.Classification != nil { + switch filter := req.Classification.Filter.(type) { + case *StringFilter_Eq: + qb.AddCondition("classification", "=", filter.Eq) + case *StringFilter_Ne: + qb.AddCondition("classification", "!=", filter.Ne) + case *StringFilter_Contains: + qb.AddLikeCondition("classification", "%" + filter.Contains + "%") + case *StringFilter_StartsWith: + qb.AddLikeCondition("classification", filter.StartsWith + "%") + case *StringFilter_EndsWith: + qb.AddLikeCondition("classification", "%" + filter.EndsWith) + case *StringFilter_Like: + qb.AddLikeCondition("classification", filter.Like) + case *StringFilter_NotLike: + qb.AddNotLikeCondition("classification", filter.NotLike) + case *StringFilter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("classification", StringSliceToInterface(filter.In.Values)) + } + case *StringFilter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("classification", StringSliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: meta_client_name + if req.MetaClientName != nil { + switch filter := req.MetaClientName.Filter.(type) { + case *StringFilter_Eq: + qb.AddCondition("meta_client_name", "=", filter.Eq) + case *StringFilter_Ne: + qb.AddCondition("meta_client_name", "!=", filter.Ne) + case *StringFilter_Contains: + qb.AddLikeCondition("meta_client_name", "%" + filter.Contains + "%") + case *StringFilter_StartsWith: + qb.AddLikeCondition("meta_client_name", filter.StartsWith + "%") + case *StringFilter_EndsWith: + qb.AddLikeCondition("meta_client_name", "%" + filter.EndsWith) + case *StringFilter_Like: + qb.AddLikeCondition("meta_client_name", filter.Like) + case *StringFilter_NotLike: + qb.AddNotLikeCondition("meta_client_name", filter.NotLike) + case *StringFilter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("meta_client_name", StringSliceToInterface(filter.In.Values)) + } + case *StringFilter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("meta_client_name", StringSliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: meta_client_implementation + if req.MetaClientImplementation != nil { + switch filter := req.MetaClientImplementation.Filter.(type) { + case *StringFilter_Eq: + qb.AddCondition("meta_client_implementation", "=", filter.Eq) + case *StringFilter_Ne: + qb.AddCondition("meta_client_implementation", "!=", filter.Ne) + case *StringFilter_Contains: + qb.AddLikeCondition("meta_client_implementation", "%" + filter.Contains + "%") + case *StringFilter_StartsWith: + qb.AddLikeCondition("meta_client_implementation", filter.StartsWith + "%") + case *StringFilter_EndsWith: + qb.AddLikeCondition("meta_client_implementation", "%" + filter.EndsWith) + case *StringFilter_Like: + qb.AddLikeCondition("meta_client_implementation", filter.Like) + case *StringFilter_NotLike: + qb.AddNotLikeCondition("meta_client_implementation", filter.NotLike) + case *StringFilter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("meta_client_implementation", StringSliceToInterface(filter.In.Values)) + } + case *StringFilter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("meta_client_implementation", StringSliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: meta_client_geo_city + if req.MetaClientGeoCity != nil { + switch filter := req.MetaClientGeoCity.Filter.(type) { + case *StringFilter_Eq: + qb.AddCondition("meta_client_geo_city", "=", filter.Eq) + case *StringFilter_Ne: + qb.AddCondition("meta_client_geo_city", "!=", filter.Ne) + case *StringFilter_Contains: + qb.AddLikeCondition("meta_client_geo_city", "%" + filter.Contains + "%") + case *StringFilter_StartsWith: + qb.AddLikeCondition("meta_client_geo_city", filter.StartsWith + "%") + case *StringFilter_EndsWith: + qb.AddLikeCondition("meta_client_geo_city", "%" + filter.EndsWith) + case *StringFilter_Like: + qb.AddLikeCondition("meta_client_geo_city", filter.Like) + case *StringFilter_NotLike: + qb.AddNotLikeCondition("meta_client_geo_city", filter.NotLike) + case *StringFilter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("meta_client_geo_city", StringSliceToInterface(filter.In.Values)) + } + case *StringFilter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("meta_client_geo_city", StringSliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: meta_client_geo_country + if req.MetaClientGeoCountry != nil { + switch filter := req.MetaClientGeoCountry.Filter.(type) { + case *StringFilter_Eq: + qb.AddCondition("meta_client_geo_country", "=", filter.Eq) + case *StringFilter_Ne: + qb.AddCondition("meta_client_geo_country", "!=", filter.Ne) + case *StringFilter_Contains: + qb.AddLikeCondition("meta_client_geo_country", "%" + filter.Contains + "%") + case *StringFilter_StartsWith: + qb.AddLikeCondition("meta_client_geo_country", filter.StartsWith + "%") + case *StringFilter_EndsWith: + qb.AddLikeCondition("meta_client_geo_country", "%" + filter.EndsWith) + case *StringFilter_Like: + qb.AddLikeCondition("meta_client_geo_country", filter.Like) + case *StringFilter_NotLike: + qb.AddNotLikeCondition("meta_client_geo_country", filter.NotLike) + case *StringFilter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("meta_client_geo_country", StringSliceToInterface(filter.In.Values)) + } + case *StringFilter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("meta_client_geo_country", StringSliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: meta_client_geo_country_code + if req.MetaClientGeoCountryCode != nil { + switch filter := req.MetaClientGeoCountryCode.Filter.(type) { + case *StringFilter_Eq: + qb.AddCondition("meta_client_geo_country_code", "=", filter.Eq) + case *StringFilter_Ne: + qb.AddCondition("meta_client_geo_country_code", "!=", filter.Ne) + case *StringFilter_Contains: + qb.AddLikeCondition("meta_client_geo_country_code", "%" + filter.Contains + "%") + case *StringFilter_StartsWith: + qb.AddLikeCondition("meta_client_geo_country_code", filter.StartsWith + "%") + case *StringFilter_EndsWith: + qb.AddLikeCondition("meta_client_geo_country_code", "%" + filter.EndsWith) + case *StringFilter_Like: + qb.AddLikeCondition("meta_client_geo_country_code", filter.Like) + case *StringFilter_NotLike: + qb.AddNotLikeCondition("meta_client_geo_country_code", filter.NotLike) + case *StringFilter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("meta_client_geo_country_code", StringSliceToInterface(filter.In.Values)) + } + case *StringFilter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("meta_client_geo_country_code", StringSliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: meta_client_geo_continent_code + if req.MetaClientGeoContinentCode != nil { + switch filter := req.MetaClientGeoContinentCode.Filter.(type) { + case *StringFilter_Eq: + qb.AddCondition("meta_client_geo_continent_code", "=", filter.Eq) + case *StringFilter_Ne: + qb.AddCondition("meta_client_geo_continent_code", "!=", filter.Ne) + case *StringFilter_Contains: + qb.AddLikeCondition("meta_client_geo_continent_code", "%" + filter.Contains + "%") + case *StringFilter_StartsWith: + qb.AddLikeCondition("meta_client_geo_continent_code", filter.StartsWith + "%") + case *StringFilter_EndsWith: + qb.AddLikeCondition("meta_client_geo_continent_code", "%" + filter.EndsWith) + case *StringFilter_Like: + qb.AddLikeCondition("meta_client_geo_continent_code", filter.Like) + case *StringFilter_NotLike: + qb.AddNotLikeCondition("meta_client_geo_continent_code", filter.NotLike) + case *StringFilter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("meta_client_geo_continent_code", StringSliceToInterface(filter.In.Values)) + } + case *StringFilter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("meta_client_geo_continent_code", StringSliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: meta_client_geo_longitude + + // Add filter for column: meta_client_geo_latitude + + // Add filter for column: meta_client_geo_autonomous_system_number + if req.MetaClientGeoAutonomousSystemNumber != nil { + switch filter := req.MetaClientGeoAutonomousSystemNumber.Filter.(type) { + case *NullableUInt32Filter_Eq: + qb.AddCondition("meta_client_geo_autonomous_system_number", "=", filter.Eq) + case *NullableUInt32Filter_Ne: + qb.AddCondition("meta_client_geo_autonomous_system_number", "!=", filter.Ne) + case *NullableUInt32Filter_Lt: + qb.AddCondition("meta_client_geo_autonomous_system_number", "<", filter.Lt) + case *NullableUInt32Filter_Lte: + qb.AddCondition("meta_client_geo_autonomous_system_number", "<=", filter.Lte) + case *NullableUInt32Filter_Gt: + qb.AddCondition("meta_client_geo_autonomous_system_number", ">", filter.Gt) + case *NullableUInt32Filter_Gte: + qb.AddCondition("meta_client_geo_autonomous_system_number", ">=", filter.Gte) + case *NullableUInt32Filter_Between: + qb.AddBetweenCondition("meta_client_geo_autonomous_system_number", filter.Between.Min, filter.Between.Max.GetValue()) + case *NullableUInt32Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("meta_client_geo_autonomous_system_number", UInt32SliceToInterface(filter.In.Values)) + } + case *NullableUInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("meta_client_geo_autonomous_system_number", UInt32SliceToInterface(filter.NotIn.Values)) + } + case *NullableUInt32Filter_IsNull: + qb.AddIsNullCondition("meta_client_geo_autonomous_system_number") + case *NullableUInt32Filter_IsNotNull: + qb.AddIsNotNullCondition("meta_client_geo_autonomous_system_number") + default: + // Unsupported filter type + } + } + + // Add filter for column: meta_client_geo_autonomous_system_organization + if req.MetaClientGeoAutonomousSystemOrganization != nil { + switch filter := req.MetaClientGeoAutonomousSystemOrganization.Filter.(type) { + case *NullableStringFilter_Eq: + qb.AddCondition("meta_client_geo_autonomous_system_organization", "=", filter.Eq) + case *NullableStringFilter_Ne: + qb.AddCondition("meta_client_geo_autonomous_system_organization", "!=", filter.Ne) + case *NullableStringFilter_Contains: + qb.AddLikeCondition("meta_client_geo_autonomous_system_organization", "%" + filter.Contains + "%") + case *NullableStringFilter_StartsWith: + qb.AddLikeCondition("meta_client_geo_autonomous_system_organization", filter.StartsWith + "%") + case *NullableStringFilter_EndsWith: + qb.AddLikeCondition("meta_client_geo_autonomous_system_organization", "%" + filter.EndsWith) + case *NullableStringFilter_Like: + qb.AddLikeCondition("meta_client_geo_autonomous_system_organization", filter.Like) + case *NullableStringFilter_NotLike: + qb.AddNotLikeCondition("meta_client_geo_autonomous_system_organization", filter.NotLike) + case *NullableStringFilter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("meta_client_geo_autonomous_system_organization", StringSliceToInterface(filter.In.Values)) + } + case *NullableStringFilter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("meta_client_geo_autonomous_system_organization", StringSliceToInterface(filter.NotIn.Values)) + } + case *NullableStringFilter_IsNull: + qb.AddIsNullCondition("meta_client_geo_autonomous_system_organization") + case *NullableStringFilter_IsNotNull: + qb.AddIsNotNullCondition("meta_client_geo_autonomous_system_organization") + default: + // Unsupported filter type + } + } + + // Add filter for column: min_slot + if req.MinSlot != nil { + switch filter := req.MinSlot.Filter.(type) { + case *UInt64Filter_Eq: + qb.AddCondition("min_slot", "=", filter.Eq) + case *UInt64Filter_Ne: + qb.AddCondition("min_slot", "!=", filter.Ne) + case *UInt64Filter_Lt: + qb.AddCondition("min_slot", "<", filter.Lt) + case *UInt64Filter_Lte: + qb.AddCondition("min_slot", "<=", filter.Lte) + case *UInt64Filter_Gt: + qb.AddCondition("min_slot", ">", filter.Gt) + case *UInt64Filter_Gte: + qb.AddCondition("min_slot", ">=", filter.Gte) + case *UInt64Filter_Between: + qb.AddBetweenCondition("min_slot", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt64Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("min_slot", UInt64SliceToInterface(filter.In.Values)) + } + case *UInt64Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("min_slot", UInt64SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: max_slot + if req.MaxSlot != nil { + switch filter := req.MaxSlot.Filter.(type) { + case *UInt64Filter_Eq: + qb.AddCondition("max_slot", "=", filter.Eq) + case *UInt64Filter_Ne: + qb.AddCondition("max_slot", "!=", filter.Ne) + case *UInt64Filter_Lt: + qb.AddCondition("max_slot", "<", filter.Lt) + case *UInt64Filter_Lte: + qb.AddCondition("max_slot", "<=", filter.Lte) + case *UInt64Filter_Gt: + qb.AddCondition("max_slot", ">", filter.Gt) + case *UInt64Filter_Gte: + qb.AddCondition("max_slot", ">=", filter.Gte) + case *UInt64Filter_Between: + qb.AddBetweenCondition("max_slot", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt64Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("max_slot", UInt64SliceToInterface(filter.In.Values)) + } + case *UInt64Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("max_slot", UInt64SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: day_count + if req.DayCount != nil { + switch filter := req.DayCount.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("day_count", "=", filter.Eq) + case *UInt32Filter_Ne: + qb.AddCondition("day_count", "!=", filter.Ne) + case *UInt32Filter_Lt: + qb.AddCondition("day_count", "<", filter.Lt) + case *UInt32Filter_Lte: + qb.AddCondition("day_count", "<=", filter.Lte) + case *UInt32Filter_Gt: + qb.AddCondition("day_count", ">", filter.Gt) + case *UInt32Filter_Gte: + qb.AddCondition("day_count", ">=", filter.Gte) + case *UInt32Filter_Between: + qb.AddBetweenCondition("day_count", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("day_count", UInt32SliceToInterface(filter.In.Values)) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("day_count", UInt32SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: epoch_count + if req.EpochCount != nil { + switch filter := req.EpochCount.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("epoch_count", "=", filter.Eq) + case *UInt32Filter_Ne: + qb.AddCondition("epoch_count", "!=", filter.Ne) + case *UInt32Filter_Lt: + qb.AddCondition("epoch_count", "<", filter.Lt) + case *UInt32Filter_Lte: + qb.AddCondition("epoch_count", "<=", filter.Lte) + case *UInt32Filter_Gt: + qb.AddCondition("epoch_count", ">", filter.Gt) + case *UInt32Filter_Gte: + qb.AddCondition("epoch_count", ">=", filter.Gte) + case *UInt32Filter_Between: + qb.AddBetweenCondition("epoch_count", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("epoch_count", UInt32SliceToInterface(filter.In.Values)) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("epoch_count", UInt32SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: slot_count + if req.SlotCount != nil { + switch filter := req.SlotCount.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("slot_count", "=", filter.Eq) + case *UInt32Filter_Ne: + qb.AddCondition("slot_count", "!=", filter.Ne) + case *UInt32Filter_Lt: + qb.AddCondition("slot_count", "<", filter.Lt) + case *UInt32Filter_Lte: + qb.AddCondition("slot_count", "<=", filter.Lte) + case *UInt32Filter_Gt: + qb.AddCondition("slot_count", ">", filter.Gt) + case *UInt32Filter_Gte: + qb.AddCondition("slot_count", ">=", filter.Gte) + case *UInt32Filter_Between: + qb.AddBetweenCondition("slot_count", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("slot_count", UInt32SliceToInterface(filter.In.Values)) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("slot_count", UInt32SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: min_seen_slot_start_diff_ms + if req.MinSeenSlotStartDiffMs != nil { + switch filter := req.MinSeenSlotStartDiffMs.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("min_seen_slot_start_diff_ms", "=", filter.Eq) + case *UInt32Filter_Ne: + qb.AddCondition("min_seen_slot_start_diff_ms", "!=", filter.Ne) + case *UInt32Filter_Lt: + qb.AddCondition("min_seen_slot_start_diff_ms", "<", filter.Lt) + case *UInt32Filter_Lte: + qb.AddCondition("min_seen_slot_start_diff_ms", "<=", filter.Lte) + case *UInt32Filter_Gt: + qb.AddCondition("min_seen_slot_start_diff_ms", ">", filter.Gt) + case *UInt32Filter_Gte: + qb.AddCondition("min_seen_slot_start_diff_ms", ">=", filter.Gte) + case *UInt32Filter_Between: + qb.AddBetweenCondition("min_seen_slot_start_diff_ms", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("min_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.In.Values)) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("min_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: p05_seen_slot_start_diff_ms + if req.P05SeenSlotStartDiffMs != nil { + switch filter := req.P05SeenSlotStartDiffMs.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("p05_seen_slot_start_diff_ms", "=", filter.Eq) + case *UInt32Filter_Ne: + qb.AddCondition("p05_seen_slot_start_diff_ms", "!=", filter.Ne) + case *UInt32Filter_Lt: + qb.AddCondition("p05_seen_slot_start_diff_ms", "<", filter.Lt) + case *UInt32Filter_Lte: + qb.AddCondition("p05_seen_slot_start_diff_ms", "<=", filter.Lte) + case *UInt32Filter_Gt: + qb.AddCondition("p05_seen_slot_start_diff_ms", ">", filter.Gt) + case *UInt32Filter_Gte: + qb.AddCondition("p05_seen_slot_start_diff_ms", ">=", filter.Gte) + case *UInt32Filter_Between: + qb.AddBetweenCondition("p05_seen_slot_start_diff_ms", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("p05_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.In.Values)) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("p05_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: p50_seen_slot_start_diff_ms + if req.P50SeenSlotStartDiffMs != nil { + switch filter := req.P50SeenSlotStartDiffMs.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("p50_seen_slot_start_diff_ms", "=", filter.Eq) + case *UInt32Filter_Ne: + qb.AddCondition("p50_seen_slot_start_diff_ms", "!=", filter.Ne) + case *UInt32Filter_Lt: + qb.AddCondition("p50_seen_slot_start_diff_ms", "<", filter.Lt) + case *UInt32Filter_Lte: + qb.AddCondition("p50_seen_slot_start_diff_ms", "<=", filter.Lte) + case *UInt32Filter_Gt: + qb.AddCondition("p50_seen_slot_start_diff_ms", ">", filter.Gt) + case *UInt32Filter_Gte: + qb.AddCondition("p50_seen_slot_start_diff_ms", ">=", filter.Gte) + case *UInt32Filter_Between: + qb.AddBetweenCondition("p50_seen_slot_start_diff_ms", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("p50_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.In.Values)) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("p50_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: avg_seen_slot_start_diff_ms + if req.AvgSeenSlotStartDiffMs != nil { + switch filter := req.AvgSeenSlotStartDiffMs.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("avg_seen_slot_start_diff_ms", "=", filter.Eq) + case *UInt32Filter_Ne: + qb.AddCondition("avg_seen_slot_start_diff_ms", "!=", filter.Ne) + case *UInt32Filter_Lt: + qb.AddCondition("avg_seen_slot_start_diff_ms", "<", filter.Lt) + case *UInt32Filter_Lte: + qb.AddCondition("avg_seen_slot_start_diff_ms", "<=", filter.Lte) + case *UInt32Filter_Gt: + qb.AddCondition("avg_seen_slot_start_diff_ms", ">", filter.Gt) + case *UInt32Filter_Gte: + qb.AddCondition("avg_seen_slot_start_diff_ms", ">=", filter.Gte) + case *UInt32Filter_Between: + qb.AddBetweenCondition("avg_seen_slot_start_diff_ms", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("avg_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.In.Values)) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("avg_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: p90_seen_slot_start_diff_ms + if req.P90SeenSlotStartDiffMs != nil { + switch filter := req.P90SeenSlotStartDiffMs.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("p90_seen_slot_start_diff_ms", "=", filter.Eq) + case *UInt32Filter_Ne: + qb.AddCondition("p90_seen_slot_start_diff_ms", "!=", filter.Ne) + case *UInt32Filter_Lt: + qb.AddCondition("p90_seen_slot_start_diff_ms", "<", filter.Lt) + case *UInt32Filter_Lte: + qb.AddCondition("p90_seen_slot_start_diff_ms", "<=", filter.Lte) + case *UInt32Filter_Gt: + qb.AddCondition("p90_seen_slot_start_diff_ms", ">", filter.Gt) + case *UInt32Filter_Gte: + qb.AddCondition("p90_seen_slot_start_diff_ms", ">=", filter.Gte) + case *UInt32Filter_Between: + qb.AddBetweenCondition("p90_seen_slot_start_diff_ms", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("p90_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.In.Values)) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("p90_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: p95_seen_slot_start_diff_ms + if req.P95SeenSlotStartDiffMs != nil { + switch filter := req.P95SeenSlotStartDiffMs.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("p95_seen_slot_start_diff_ms", "=", filter.Eq) + case *UInt32Filter_Ne: + qb.AddCondition("p95_seen_slot_start_diff_ms", "!=", filter.Ne) + case *UInt32Filter_Lt: + qb.AddCondition("p95_seen_slot_start_diff_ms", "<", filter.Lt) + case *UInt32Filter_Lte: + qb.AddCondition("p95_seen_slot_start_diff_ms", "<=", filter.Lte) + case *UInt32Filter_Gt: + qb.AddCondition("p95_seen_slot_start_diff_ms", ">", filter.Gt) + case *UInt32Filter_Gte: + qb.AddCondition("p95_seen_slot_start_diff_ms", ">=", filter.Gte) + case *UInt32Filter_Between: + qb.AddBetweenCondition("p95_seen_slot_start_diff_ms", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("p95_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.In.Values)) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("p95_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: p99_seen_slot_start_diff_ms + if req.P99SeenSlotStartDiffMs != nil { + switch filter := req.P99SeenSlotStartDiffMs.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("p99_seen_slot_start_diff_ms", "=", filter.Eq) + case *UInt32Filter_Ne: + qb.AddCondition("p99_seen_slot_start_diff_ms", "!=", filter.Ne) + case *UInt32Filter_Lt: + qb.AddCondition("p99_seen_slot_start_diff_ms", "<", filter.Lt) + case *UInt32Filter_Lte: + qb.AddCondition("p99_seen_slot_start_diff_ms", "<=", filter.Lte) + case *UInt32Filter_Gt: + qb.AddCondition("p99_seen_slot_start_diff_ms", ">", filter.Gt) + case *UInt32Filter_Gte: + qb.AddCondition("p99_seen_slot_start_diff_ms", ">=", filter.Gte) + case *UInt32Filter_Between: + qb.AddBetweenCondition("p99_seen_slot_start_diff_ms", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("p99_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.In.Values)) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("p99_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: max_seen_slot_start_diff_ms + if req.MaxSeenSlotStartDiffMs != nil { + switch filter := req.MaxSeenSlotStartDiffMs.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("max_seen_slot_start_diff_ms", "=", filter.Eq) + case *UInt32Filter_Ne: + qb.AddCondition("max_seen_slot_start_diff_ms", "!=", filter.Ne) + case *UInt32Filter_Lt: + qb.AddCondition("max_seen_slot_start_diff_ms", "<", filter.Lt) + case *UInt32Filter_Lte: + qb.AddCondition("max_seen_slot_start_diff_ms", "<=", filter.Lte) + case *UInt32Filter_Gt: + qb.AddCondition("max_seen_slot_start_diff_ms", ">", filter.Gt) + case *UInt32Filter_Gte: + qb.AddCondition("max_seen_slot_start_diff_ms", ">=", filter.Gte) + case *UInt32Filter_Between: + qb.AddBetweenCondition("max_seen_slot_start_diff_ms", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("max_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.In.Values)) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("max_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Handle pagination per AIP-132 + // Validate page size + if req.PageSize < 0 { + return SQLQuery{}, fmt.Errorf("page_size must be non-negative, got %d", req.PageSize) + } + if req.PageSize > 10000 { + return SQLQuery{}, fmt.Errorf("page_size must not exceed %d, got %d", 10000, req.PageSize) + } + + var limit, offset uint32 + limit = 100 // Default page size + if req.PageSize > 0 { + limit = uint32(req.PageSize) + } + if req.PageToken != "" { + decodedOffset, err := DecodePageToken(req.PageToken) + if err != nil { + return SQLQuery{}, fmt.Errorf("invalid page_token: %w", err) + } + offset = decodedOffset + } + + // Handle custom ordering if provided + var orderByClause string + if req.OrderBy != "" { + validFields := []string{"updated_date_time", "month", "month_start_date_time", "username", "node_id", "classification", "meta_client_name", "meta_client_implementation", "meta_client_geo_city", "meta_client_geo_country", "meta_client_geo_country_code", "meta_client_geo_continent_code", "meta_client_geo_longitude", "meta_client_geo_latitude", "meta_client_geo_autonomous_system_number", "meta_client_geo_autonomous_system_organization", "min_slot", "max_slot", "day_count", "epoch_count", "slot_count", "min_seen_slot_start_diff_ms", "p05_seen_slot_start_diff_ms", "p50_seen_slot_start_diff_ms", "avg_seen_slot_start_diff_ms", "p90_seen_slot_start_diff_ms", "p95_seen_slot_start_diff_ms", "p99_seen_slot_start_diff_ms", "max_seen_slot_start_diff_ms"} + orderFields, err := ParseOrderBy(req.OrderBy, validFields) + if err != nil { + return SQLQuery{}, fmt.Errorf("invalid order_by: %w", err) + } + orderByClause = BuildOrderByClause(orderFields) + } else { + // Default sorting by primary key + orderByClause = " ORDER BY month" + ", meta_client_name" + } + + // Build column list + columns := []string{"toUnixTimestamp(`updated_date_time`) AS `updated_date_time`", "month", "toUnixTimestamp(`month_start_date_time`) AS `month_start_date_time`", "username", "node_id", "classification", "meta_client_name", "meta_client_implementation", "meta_client_geo_city", "meta_client_geo_country", "meta_client_geo_country_code", "meta_client_geo_continent_code", "meta_client_geo_longitude", "meta_client_geo_latitude", "meta_client_geo_autonomous_system_number", "meta_client_geo_autonomous_system_organization", "min_slot", "max_slot", "day_count", "epoch_count", "slot_count", "min_seen_slot_start_diff_ms", "p05_seen_slot_start_diff_ms", "p50_seen_slot_start_diff_ms", "avg_seen_slot_start_diff_ms", "p90_seen_slot_start_diff_ms", "p95_seen_slot_start_diff_ms", "p99_seen_slot_start_diff_ms", "max_seen_slot_start_diff_ms"} + + return BuildParameterizedQuery("fct_block_first_seen_by_node_monthly", columns, qb, orderByClause, limit, offset, options...) +} + +// BuildGetFctBlockFirstSeenByNodeMonthlyQuery constructs a parameterized SQL query from a GetFctBlockFirstSeenByNodeMonthlyRequest +func BuildGetFctBlockFirstSeenByNodeMonthlyQuery(req *GetFctBlockFirstSeenByNodeMonthlyRequest, options ...QueryOption) (SQLQuery, error) { + // Validate primary key is provided + if req.Month == 0 { + return SQLQuery{}, fmt.Errorf("primary key field month is required") + } + + // Build query with primary key condition + qb := NewQueryBuilder() + qb.AddCondition("month", "=", req.Month) + + // Build ORDER BY clause + orderByClause := " ORDER BY month, meta_client_name" + + // Build column list + columns := []string{"toUnixTimestamp(`updated_date_time`) AS `updated_date_time`", "month", "toUnixTimestamp(`month_start_date_time`) AS `month_start_date_time`", "username", "node_id", "classification", "meta_client_name", "meta_client_implementation", "meta_client_geo_city", "meta_client_geo_country", "meta_client_geo_country_code", "meta_client_geo_continent_code", "meta_client_geo_longitude", "meta_client_geo_latitude", "meta_client_geo_autonomous_system_number", "meta_client_geo_autonomous_system_organization", "min_slot", "max_slot", "day_count", "epoch_count", "slot_count", "min_seen_slot_start_diff_ms", "p05_seen_slot_start_diff_ms", "p50_seen_slot_start_diff_ms", "avg_seen_slot_start_diff_ms", "p90_seen_slot_start_diff_ms", "p95_seen_slot_start_diff_ms", "p99_seen_slot_start_diff_ms", "max_seen_slot_start_diff_ms"} + + // Return single record + return BuildParameterizedQuery("fct_block_first_seen_by_node_monthly", columns, qb, orderByClause, 1, 0, options...) +} diff --git a/pkg/proto/clickhouse/fct_block_first_seen_by_node_monthly.pb.go b/pkg/proto/clickhouse/fct_block_first_seen_by_node_monthly.pb.go new file mode 100644 index 00000000..55e29ea2 --- /dev/null +++ b/pkg/proto/clickhouse/fct_block_first_seen_by_node_monthly.pb.go @@ -0,0 +1,1295 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.34.2 +// protoc (unknown) +// source: fct_block_first_seen_by_node_monthly.proto + +package clickhouse + +import ( + _ "github.com/ethpandaops/xatu-cbt/pkg/proto/clickhouse/clickhouse" + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + wrapperspb "google.golang.org/protobuf/types/known/wrapperspb" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type FctBlockFirstSeenByNodeMonthly struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Timestamp when the record was last updated + UpdatedDateTime uint32 `protobuf:"varint,11,opt,name=updated_date_time,json=updatedDateTime,proto3" json:"updated_date_time,omitempty"` + // Year and month in YYYYMM format (e.g., 202507) + Month uint32 `protobuf:"varint,12,opt,name=month,proto3" json:"month,omitempty"` + // Start of month at midnight UTC + MonthStartDateTime uint32 `protobuf:"varint,13,opt,name=month_start_date_time,json=monthStartDateTime,proto3" json:"month_start_date_time,omitempty"` + // Username of the node + Username string `protobuf:"bytes,14,opt,name=username,proto3" json:"username,omitempty"` + // ID of the node + NodeId string `protobuf:"bytes,15,opt,name=node_id,json=nodeId,proto3" json:"node_id,omitempty"` + // Classification of the node, e.g. "individual", "corporate", "internal" (aka ethPandaOps) or "unclassified" + Classification string `protobuf:"bytes,16,opt,name=classification,proto3" json:"classification,omitempty"` + // Name of the client + MetaClientName string `protobuf:"bytes,17,opt,name=meta_client_name,json=metaClientName,proto3" json:"meta_client_name,omitempty"` + // Implementation of the client + MetaClientImplementation string `protobuf:"bytes,18,opt,name=meta_client_implementation,json=metaClientImplementation,proto3" json:"meta_client_implementation,omitempty"` + // City of the client + MetaClientGeoCity string `protobuf:"bytes,19,opt,name=meta_client_geo_city,json=metaClientGeoCity,proto3" json:"meta_client_geo_city,omitempty"` + // Country of the client + MetaClientGeoCountry string `protobuf:"bytes,20,opt,name=meta_client_geo_country,json=metaClientGeoCountry,proto3" json:"meta_client_geo_country,omitempty"` + // Country code of the client + MetaClientGeoCountryCode string `protobuf:"bytes,21,opt,name=meta_client_geo_country_code,json=metaClientGeoCountryCode,proto3" json:"meta_client_geo_country_code,omitempty"` + // Continent code of the client + MetaClientGeoContinentCode string `protobuf:"bytes,22,opt,name=meta_client_geo_continent_code,json=metaClientGeoContinentCode,proto3" json:"meta_client_geo_continent_code,omitempty"` + // Longitude of the client + MetaClientGeoLongitude *wrapperspb.DoubleValue `protobuf:"bytes,23,opt,name=meta_client_geo_longitude,json=metaClientGeoLongitude,proto3" json:"meta_client_geo_longitude,omitempty"` + // Latitude of the client + MetaClientGeoLatitude *wrapperspb.DoubleValue `protobuf:"bytes,24,opt,name=meta_client_geo_latitude,json=metaClientGeoLatitude,proto3" json:"meta_client_geo_latitude,omitempty"` + // Autonomous system number of the client + MetaClientGeoAutonomousSystemNumber *wrapperspb.UInt32Value `protobuf:"bytes,25,opt,name=meta_client_geo_autonomous_system_number,json=metaClientGeoAutonomousSystemNumber,proto3" json:"meta_client_geo_autonomous_system_number,omitempty"` + // Autonomous system organization of the client + MetaClientGeoAutonomousSystemOrganization *wrapperspb.StringValue `protobuf:"bytes,26,opt,name=meta_client_geo_autonomous_system_organization,json=metaClientGeoAutonomousSystemOrganization,proto3" json:"meta_client_geo_autonomous_system_organization,omitempty"` + // Minimum slot number in this month + MinSlot uint64 `protobuf:"varint,27,opt,name=min_slot,json=minSlot,proto3" json:"min_slot,omitempty"` + // Maximum slot number in this month + MaxSlot uint64 `protobuf:"varint,28,opt,name=max_slot,json=maxSlot,proto3" json:"max_slot,omitempty"` + // Number of days in this month + DayCount uint32 `protobuf:"varint,29,opt,name=day_count,json=dayCount,proto3" json:"day_count,omitempty"` + // Number of epochs in this month + EpochCount uint32 `protobuf:"varint,30,opt,name=epoch_count,json=epochCount,proto3" json:"epoch_count,omitempty"` + // Number of slots with blocks seen in this month + SlotCount uint32 `protobuf:"varint,31,opt,name=slot_count,json=slotCount,proto3" json:"slot_count,omitempty"` + // Minimum time from slot start for the node to see a block (milliseconds) + MinSeenSlotStartDiffMs uint32 `protobuf:"varint,32,opt,name=min_seen_slot_start_diff_ms,json=minSeenSlotStartDiffMs,proto3" json:"min_seen_slot_start_diff_ms,omitempty"` + // 5th percentile time from slot start (milliseconds) + P05SeenSlotStartDiffMs uint32 `protobuf:"varint,33,opt,name=p05_seen_slot_start_diff_ms,json=p05SeenSlotStartDiffMs,proto3" json:"p05_seen_slot_start_diff_ms,omitempty"` + // Median (p50) time from slot start (milliseconds) + P50SeenSlotStartDiffMs uint32 `protobuf:"varint,34,opt,name=p50_seen_slot_start_diff_ms,json=p50SeenSlotStartDiffMs,proto3" json:"p50_seen_slot_start_diff_ms,omitempty"` + // Average time from slot start (milliseconds) + AvgSeenSlotStartDiffMs uint32 `protobuf:"varint,35,opt,name=avg_seen_slot_start_diff_ms,json=avgSeenSlotStartDiffMs,proto3" json:"avg_seen_slot_start_diff_ms,omitempty"` + // 90th percentile time from slot start (milliseconds) + P90SeenSlotStartDiffMs uint32 `protobuf:"varint,36,opt,name=p90_seen_slot_start_diff_ms,json=p90SeenSlotStartDiffMs,proto3" json:"p90_seen_slot_start_diff_ms,omitempty"` + // 95th percentile time from slot start (milliseconds) + P95SeenSlotStartDiffMs uint32 `protobuf:"varint,37,opt,name=p95_seen_slot_start_diff_ms,json=p95SeenSlotStartDiffMs,proto3" json:"p95_seen_slot_start_diff_ms,omitempty"` + // 99th percentile time from slot start (milliseconds) + P99SeenSlotStartDiffMs uint32 `protobuf:"varint,38,opt,name=p99_seen_slot_start_diff_ms,json=p99SeenSlotStartDiffMs,proto3" json:"p99_seen_slot_start_diff_ms,omitempty"` + // Maximum time from slot start (milliseconds) + MaxSeenSlotStartDiffMs uint32 `protobuf:"varint,39,opt,name=max_seen_slot_start_diff_ms,json=maxSeenSlotStartDiffMs,proto3" json:"max_seen_slot_start_diff_ms,omitempty"` +} + +func (x *FctBlockFirstSeenByNodeMonthly) Reset() { + *x = FctBlockFirstSeenByNodeMonthly{} + if protoimpl.UnsafeEnabled { + mi := &file_fct_block_first_seen_by_node_monthly_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FctBlockFirstSeenByNodeMonthly) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FctBlockFirstSeenByNodeMonthly) ProtoMessage() {} + +func (x *FctBlockFirstSeenByNodeMonthly) ProtoReflect() protoreflect.Message { + mi := &file_fct_block_first_seen_by_node_monthly_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FctBlockFirstSeenByNodeMonthly.ProtoReflect.Descriptor instead. +func (*FctBlockFirstSeenByNodeMonthly) Descriptor() ([]byte, []int) { + return file_fct_block_first_seen_by_node_monthly_proto_rawDescGZIP(), []int{0} +} + +func (x *FctBlockFirstSeenByNodeMonthly) GetUpdatedDateTime() uint32 { + if x != nil { + return x.UpdatedDateTime + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeMonthly) GetMonth() uint32 { + if x != nil { + return x.Month + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeMonthly) GetMonthStartDateTime() uint32 { + if x != nil { + return x.MonthStartDateTime + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeMonthly) GetUsername() string { + if x != nil { + return x.Username + } + return "" +} + +func (x *FctBlockFirstSeenByNodeMonthly) GetNodeId() string { + if x != nil { + return x.NodeId + } + return "" +} + +func (x *FctBlockFirstSeenByNodeMonthly) GetClassification() string { + if x != nil { + return x.Classification + } + return "" +} + +func (x *FctBlockFirstSeenByNodeMonthly) GetMetaClientName() string { + if x != nil { + return x.MetaClientName + } + return "" +} + +func (x *FctBlockFirstSeenByNodeMonthly) GetMetaClientImplementation() string { + if x != nil { + return x.MetaClientImplementation + } + return "" +} + +func (x *FctBlockFirstSeenByNodeMonthly) GetMetaClientGeoCity() string { + if x != nil { + return x.MetaClientGeoCity + } + return "" +} + +func (x *FctBlockFirstSeenByNodeMonthly) GetMetaClientGeoCountry() string { + if x != nil { + return x.MetaClientGeoCountry + } + return "" +} + +func (x *FctBlockFirstSeenByNodeMonthly) GetMetaClientGeoCountryCode() string { + if x != nil { + return x.MetaClientGeoCountryCode + } + return "" +} + +func (x *FctBlockFirstSeenByNodeMonthly) GetMetaClientGeoContinentCode() string { + if x != nil { + return x.MetaClientGeoContinentCode + } + return "" +} + +func (x *FctBlockFirstSeenByNodeMonthly) GetMetaClientGeoLongitude() *wrapperspb.DoubleValue { + if x != nil { + return x.MetaClientGeoLongitude + } + return nil +} + +func (x *FctBlockFirstSeenByNodeMonthly) GetMetaClientGeoLatitude() *wrapperspb.DoubleValue { + if x != nil { + return x.MetaClientGeoLatitude + } + return nil +} + +func (x *FctBlockFirstSeenByNodeMonthly) GetMetaClientGeoAutonomousSystemNumber() *wrapperspb.UInt32Value { + if x != nil { + return x.MetaClientGeoAutonomousSystemNumber + } + return nil +} + +func (x *FctBlockFirstSeenByNodeMonthly) GetMetaClientGeoAutonomousSystemOrganization() *wrapperspb.StringValue { + if x != nil { + return x.MetaClientGeoAutonomousSystemOrganization + } + return nil +} + +func (x *FctBlockFirstSeenByNodeMonthly) GetMinSlot() uint64 { + if x != nil { + return x.MinSlot + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeMonthly) GetMaxSlot() uint64 { + if x != nil { + return x.MaxSlot + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeMonthly) GetDayCount() uint32 { + if x != nil { + return x.DayCount + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeMonthly) GetEpochCount() uint32 { + if x != nil { + return x.EpochCount + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeMonthly) GetSlotCount() uint32 { + if x != nil { + return x.SlotCount + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeMonthly) GetMinSeenSlotStartDiffMs() uint32 { + if x != nil { + return x.MinSeenSlotStartDiffMs + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeMonthly) GetP05SeenSlotStartDiffMs() uint32 { + if x != nil { + return x.P05SeenSlotStartDiffMs + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeMonthly) GetP50SeenSlotStartDiffMs() uint32 { + if x != nil { + return x.P50SeenSlotStartDiffMs + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeMonthly) GetAvgSeenSlotStartDiffMs() uint32 { + if x != nil { + return x.AvgSeenSlotStartDiffMs + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeMonthly) GetP90SeenSlotStartDiffMs() uint32 { + if x != nil { + return x.P90SeenSlotStartDiffMs + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeMonthly) GetP95SeenSlotStartDiffMs() uint32 { + if x != nil { + return x.P95SeenSlotStartDiffMs + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeMonthly) GetP99SeenSlotStartDiffMs() uint32 { + if x != nil { + return x.P99SeenSlotStartDiffMs + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeMonthly) GetMaxSeenSlotStartDiffMs() uint32 { + if x != nil { + return x.MaxSeenSlotStartDiffMs + } + return 0 +} + +// Request for listing fct_block_first_seen_by_node_monthly records +type ListFctBlockFirstSeenByNodeMonthlyRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Filter by month - Year and month in YYYYMM format (e.g., 202507) (PRIMARY KEY - required) + Month *UInt32Filter `protobuf:"bytes,1,opt,name=month,proto3" json:"month,omitempty"` + // Filter by meta_client_name - Name of the client (ORDER BY column 2 - optional) + MetaClientName *StringFilter `protobuf:"bytes,2,opt,name=meta_client_name,json=metaClientName,proto3" json:"meta_client_name,omitempty"` + // Filter by updated_date_time - Timestamp when the record was last updated (optional) + UpdatedDateTime *UInt32Filter `protobuf:"bytes,3,opt,name=updated_date_time,json=updatedDateTime,proto3" json:"updated_date_time,omitempty"` + // Filter by month_start_date_time - Start of month at midnight UTC (optional) + MonthStartDateTime *UInt32Filter `protobuf:"bytes,4,opt,name=month_start_date_time,json=monthStartDateTime,proto3" json:"month_start_date_time,omitempty"` + // Filter by username - Username of the node (optional) + Username *StringFilter `protobuf:"bytes,5,opt,name=username,proto3" json:"username,omitempty"` + // Filter by node_id - ID of the node (optional) + NodeId *StringFilter `protobuf:"bytes,6,opt,name=node_id,json=nodeId,proto3" json:"node_id,omitempty"` + // Filter by classification - Classification of the node, e.g. "individual", "corporate", "internal" (aka ethPandaOps) or "unclassified" (optional) + Classification *StringFilter `protobuf:"bytes,7,opt,name=classification,proto3" json:"classification,omitempty"` + // Filter by meta_client_implementation - Implementation of the client (optional) + MetaClientImplementation *StringFilter `protobuf:"bytes,8,opt,name=meta_client_implementation,json=metaClientImplementation,proto3" json:"meta_client_implementation,omitempty"` + // Filter by meta_client_geo_city - City of the client (optional) + MetaClientGeoCity *StringFilter `protobuf:"bytes,9,opt,name=meta_client_geo_city,json=metaClientGeoCity,proto3" json:"meta_client_geo_city,omitempty"` + // Filter by meta_client_geo_country - Country of the client (optional) + MetaClientGeoCountry *StringFilter `protobuf:"bytes,10,opt,name=meta_client_geo_country,json=metaClientGeoCountry,proto3" json:"meta_client_geo_country,omitempty"` + // Filter by meta_client_geo_country_code - Country code of the client (optional) + MetaClientGeoCountryCode *StringFilter `protobuf:"bytes,11,opt,name=meta_client_geo_country_code,json=metaClientGeoCountryCode,proto3" json:"meta_client_geo_country_code,omitempty"` + // Filter by meta_client_geo_continent_code - Continent code of the client (optional) + MetaClientGeoContinentCode *StringFilter `protobuf:"bytes,12,opt,name=meta_client_geo_continent_code,json=metaClientGeoContinentCode,proto3" json:"meta_client_geo_continent_code,omitempty"` + // Filter by meta_client_geo_longitude - Longitude of the client (optional) + MetaClientGeoLongitude *wrapperspb.DoubleValue `protobuf:"bytes,13,opt,name=meta_client_geo_longitude,json=metaClientGeoLongitude,proto3" json:"meta_client_geo_longitude,omitempty"` + // Filter by meta_client_geo_latitude - Latitude of the client (optional) + MetaClientGeoLatitude *wrapperspb.DoubleValue `protobuf:"bytes,14,opt,name=meta_client_geo_latitude,json=metaClientGeoLatitude,proto3" json:"meta_client_geo_latitude,omitempty"` + // Filter by meta_client_geo_autonomous_system_number - Autonomous system number of the client (optional) + MetaClientGeoAutonomousSystemNumber *NullableUInt32Filter `protobuf:"bytes,15,opt,name=meta_client_geo_autonomous_system_number,json=metaClientGeoAutonomousSystemNumber,proto3" json:"meta_client_geo_autonomous_system_number,omitempty"` + // Filter by meta_client_geo_autonomous_system_organization - Autonomous system organization of the client (optional) + MetaClientGeoAutonomousSystemOrganization *NullableStringFilter `protobuf:"bytes,16,opt,name=meta_client_geo_autonomous_system_organization,json=metaClientGeoAutonomousSystemOrganization,proto3" json:"meta_client_geo_autonomous_system_organization,omitempty"` + // Filter by min_slot - Minimum slot number in this month (optional) + MinSlot *UInt64Filter `protobuf:"bytes,17,opt,name=min_slot,json=minSlot,proto3" json:"min_slot,omitempty"` + // Filter by max_slot - Maximum slot number in this month (optional) + MaxSlot *UInt64Filter `protobuf:"bytes,18,opt,name=max_slot,json=maxSlot,proto3" json:"max_slot,omitempty"` + // Filter by day_count - Number of days in this month (optional) + DayCount *UInt32Filter `protobuf:"bytes,19,opt,name=day_count,json=dayCount,proto3" json:"day_count,omitempty"` + // Filter by epoch_count - Number of epochs in this month (optional) + EpochCount *UInt32Filter `protobuf:"bytes,20,opt,name=epoch_count,json=epochCount,proto3" json:"epoch_count,omitempty"` + // Filter by slot_count - Number of slots with blocks seen in this month (optional) + SlotCount *UInt32Filter `protobuf:"bytes,21,opt,name=slot_count,json=slotCount,proto3" json:"slot_count,omitempty"` + // Filter by min_seen_slot_start_diff_ms - Minimum time from slot start for the node to see a block (milliseconds) (optional) + MinSeenSlotStartDiffMs *UInt32Filter `protobuf:"bytes,22,opt,name=min_seen_slot_start_diff_ms,json=minSeenSlotStartDiffMs,proto3" json:"min_seen_slot_start_diff_ms,omitempty"` + // Filter by p05_seen_slot_start_diff_ms - 5th percentile time from slot start (milliseconds) (optional) + P05SeenSlotStartDiffMs *UInt32Filter `protobuf:"bytes,23,opt,name=p05_seen_slot_start_diff_ms,json=p05SeenSlotStartDiffMs,proto3" json:"p05_seen_slot_start_diff_ms,omitempty"` + // Filter by p50_seen_slot_start_diff_ms - Median (p50) time from slot start (milliseconds) (optional) + P50SeenSlotStartDiffMs *UInt32Filter `protobuf:"bytes,24,opt,name=p50_seen_slot_start_diff_ms,json=p50SeenSlotStartDiffMs,proto3" json:"p50_seen_slot_start_diff_ms,omitempty"` + // Filter by avg_seen_slot_start_diff_ms - Average time from slot start (milliseconds) (optional) + AvgSeenSlotStartDiffMs *UInt32Filter `protobuf:"bytes,25,opt,name=avg_seen_slot_start_diff_ms,json=avgSeenSlotStartDiffMs,proto3" json:"avg_seen_slot_start_diff_ms,omitempty"` + // Filter by p90_seen_slot_start_diff_ms - 90th percentile time from slot start (milliseconds) (optional) + P90SeenSlotStartDiffMs *UInt32Filter `protobuf:"bytes,26,opt,name=p90_seen_slot_start_diff_ms,json=p90SeenSlotStartDiffMs,proto3" json:"p90_seen_slot_start_diff_ms,omitempty"` + // Filter by p95_seen_slot_start_diff_ms - 95th percentile time from slot start (milliseconds) (optional) + P95SeenSlotStartDiffMs *UInt32Filter `protobuf:"bytes,27,opt,name=p95_seen_slot_start_diff_ms,json=p95SeenSlotStartDiffMs,proto3" json:"p95_seen_slot_start_diff_ms,omitempty"` + // Filter by p99_seen_slot_start_diff_ms - 99th percentile time from slot start (milliseconds) (optional) + P99SeenSlotStartDiffMs *UInt32Filter `protobuf:"bytes,28,opt,name=p99_seen_slot_start_diff_ms,json=p99SeenSlotStartDiffMs,proto3" json:"p99_seen_slot_start_diff_ms,omitempty"` + // Filter by max_seen_slot_start_diff_ms - Maximum time from slot start (milliseconds) (optional) + MaxSeenSlotStartDiffMs *UInt32Filter `protobuf:"bytes,29,opt,name=max_seen_slot_start_diff_ms,json=maxSeenSlotStartDiffMs,proto3" json:"max_seen_slot_start_diff_ms,omitempty"` + // The maximum number of fct_block_first_seen_by_node_monthly to return. + // If unspecified, at most 100 items will be returned. + // The maximum value is 10000; values above 10000 will be coerced to 10000. + PageSize int32 `protobuf:"varint,30,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + // A page token, received from a previous `ListFctBlockFirstSeenByNodeMonthly` call. + // Provide this to retrieve the subsequent page. + PageToken string `protobuf:"bytes,31,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + // The order of results. Format: comma-separated list of fields. + // Example: "foo,bar" or "foo desc,bar" for descending order on foo. + // If unspecified, results will be returned in the default order. + OrderBy string `protobuf:"bytes,32,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"` +} + +func (x *ListFctBlockFirstSeenByNodeMonthlyRequest) Reset() { + *x = ListFctBlockFirstSeenByNodeMonthlyRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_fct_block_first_seen_by_node_monthly_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListFctBlockFirstSeenByNodeMonthlyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListFctBlockFirstSeenByNodeMonthlyRequest) ProtoMessage() {} + +func (x *ListFctBlockFirstSeenByNodeMonthlyRequest) ProtoReflect() protoreflect.Message { + mi := &file_fct_block_first_seen_by_node_monthly_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListFctBlockFirstSeenByNodeMonthlyRequest.ProtoReflect.Descriptor instead. +func (*ListFctBlockFirstSeenByNodeMonthlyRequest) Descriptor() ([]byte, []int) { + return file_fct_block_first_seen_by_node_monthly_proto_rawDescGZIP(), []int{1} +} + +func (x *ListFctBlockFirstSeenByNodeMonthlyRequest) GetMonth() *UInt32Filter { + if x != nil { + return x.Month + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeMonthlyRequest) GetMetaClientName() *StringFilter { + if x != nil { + return x.MetaClientName + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeMonthlyRequest) GetUpdatedDateTime() *UInt32Filter { + if x != nil { + return x.UpdatedDateTime + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeMonthlyRequest) GetMonthStartDateTime() *UInt32Filter { + if x != nil { + return x.MonthStartDateTime + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeMonthlyRequest) GetUsername() *StringFilter { + if x != nil { + return x.Username + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeMonthlyRequest) GetNodeId() *StringFilter { + if x != nil { + return x.NodeId + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeMonthlyRequest) GetClassification() *StringFilter { + if x != nil { + return x.Classification + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeMonthlyRequest) GetMetaClientImplementation() *StringFilter { + if x != nil { + return x.MetaClientImplementation + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeMonthlyRequest) GetMetaClientGeoCity() *StringFilter { + if x != nil { + return x.MetaClientGeoCity + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeMonthlyRequest) GetMetaClientGeoCountry() *StringFilter { + if x != nil { + return x.MetaClientGeoCountry + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeMonthlyRequest) GetMetaClientGeoCountryCode() *StringFilter { + if x != nil { + return x.MetaClientGeoCountryCode + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeMonthlyRequest) GetMetaClientGeoContinentCode() *StringFilter { + if x != nil { + return x.MetaClientGeoContinentCode + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeMonthlyRequest) GetMetaClientGeoLongitude() *wrapperspb.DoubleValue { + if x != nil { + return x.MetaClientGeoLongitude + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeMonthlyRequest) GetMetaClientGeoLatitude() *wrapperspb.DoubleValue { + if x != nil { + return x.MetaClientGeoLatitude + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeMonthlyRequest) GetMetaClientGeoAutonomousSystemNumber() *NullableUInt32Filter { + if x != nil { + return x.MetaClientGeoAutonomousSystemNumber + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeMonthlyRequest) GetMetaClientGeoAutonomousSystemOrganization() *NullableStringFilter { + if x != nil { + return x.MetaClientGeoAutonomousSystemOrganization + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeMonthlyRequest) GetMinSlot() *UInt64Filter { + if x != nil { + return x.MinSlot + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeMonthlyRequest) GetMaxSlot() *UInt64Filter { + if x != nil { + return x.MaxSlot + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeMonthlyRequest) GetDayCount() *UInt32Filter { + if x != nil { + return x.DayCount + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeMonthlyRequest) GetEpochCount() *UInt32Filter { + if x != nil { + return x.EpochCount + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeMonthlyRequest) GetSlotCount() *UInt32Filter { + if x != nil { + return x.SlotCount + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeMonthlyRequest) GetMinSeenSlotStartDiffMs() *UInt32Filter { + if x != nil { + return x.MinSeenSlotStartDiffMs + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeMonthlyRequest) GetP05SeenSlotStartDiffMs() *UInt32Filter { + if x != nil { + return x.P05SeenSlotStartDiffMs + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeMonthlyRequest) GetP50SeenSlotStartDiffMs() *UInt32Filter { + if x != nil { + return x.P50SeenSlotStartDiffMs + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeMonthlyRequest) GetAvgSeenSlotStartDiffMs() *UInt32Filter { + if x != nil { + return x.AvgSeenSlotStartDiffMs + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeMonthlyRequest) GetP90SeenSlotStartDiffMs() *UInt32Filter { + if x != nil { + return x.P90SeenSlotStartDiffMs + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeMonthlyRequest) GetP95SeenSlotStartDiffMs() *UInt32Filter { + if x != nil { + return x.P95SeenSlotStartDiffMs + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeMonthlyRequest) GetP99SeenSlotStartDiffMs() *UInt32Filter { + if x != nil { + return x.P99SeenSlotStartDiffMs + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeMonthlyRequest) GetMaxSeenSlotStartDiffMs() *UInt32Filter { + if x != nil { + return x.MaxSeenSlotStartDiffMs + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeMonthlyRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListFctBlockFirstSeenByNodeMonthlyRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +func (x *ListFctBlockFirstSeenByNodeMonthlyRequest) GetOrderBy() string { + if x != nil { + return x.OrderBy + } + return "" +} + +// Response for listing fct_block_first_seen_by_node_monthly records +type ListFctBlockFirstSeenByNodeMonthlyResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The list of fct_block_first_seen_by_node_monthly. + FctBlockFirstSeenByNodeMonthly []*FctBlockFirstSeenByNodeMonthly `protobuf:"bytes,1,rep,name=fct_block_first_seen_by_node_monthly,json=fctBlockFirstSeenByNodeMonthly,proto3" json:"fct_block_first_seen_by_node_monthly,omitempty"` + // A token, which can be sent as `page_token` to retrieve the next page. + // If this field is omitted, there are no subsequent pages. + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` +} + +func (x *ListFctBlockFirstSeenByNodeMonthlyResponse) Reset() { + *x = ListFctBlockFirstSeenByNodeMonthlyResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_fct_block_first_seen_by_node_monthly_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListFctBlockFirstSeenByNodeMonthlyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListFctBlockFirstSeenByNodeMonthlyResponse) ProtoMessage() {} + +func (x *ListFctBlockFirstSeenByNodeMonthlyResponse) ProtoReflect() protoreflect.Message { + mi := &file_fct_block_first_seen_by_node_monthly_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListFctBlockFirstSeenByNodeMonthlyResponse.ProtoReflect.Descriptor instead. +func (*ListFctBlockFirstSeenByNodeMonthlyResponse) Descriptor() ([]byte, []int) { + return file_fct_block_first_seen_by_node_monthly_proto_rawDescGZIP(), []int{2} +} + +func (x *ListFctBlockFirstSeenByNodeMonthlyResponse) GetFctBlockFirstSeenByNodeMonthly() []*FctBlockFirstSeenByNodeMonthly { + if x != nil { + return x.FctBlockFirstSeenByNodeMonthly + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeMonthlyResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +// Request for getting a single fct_block_first_seen_by_node_monthly record by primary key +type GetFctBlockFirstSeenByNodeMonthlyRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Year and month in YYYYMM format (e.g., 202507) + Month uint32 `protobuf:"varint,1,opt,name=month,proto3" json:"month,omitempty"` // Primary key (required) +} + +func (x *GetFctBlockFirstSeenByNodeMonthlyRequest) Reset() { + *x = GetFctBlockFirstSeenByNodeMonthlyRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_fct_block_first_seen_by_node_monthly_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetFctBlockFirstSeenByNodeMonthlyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetFctBlockFirstSeenByNodeMonthlyRequest) ProtoMessage() {} + +func (x *GetFctBlockFirstSeenByNodeMonthlyRequest) ProtoReflect() protoreflect.Message { + mi := &file_fct_block_first_seen_by_node_monthly_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetFctBlockFirstSeenByNodeMonthlyRequest.ProtoReflect.Descriptor instead. +func (*GetFctBlockFirstSeenByNodeMonthlyRequest) Descriptor() ([]byte, []int) { + return file_fct_block_first_seen_by_node_monthly_proto_rawDescGZIP(), []int{3} +} + +func (x *GetFctBlockFirstSeenByNodeMonthlyRequest) GetMonth() uint32 { + if x != nil { + return x.Month + } + return 0 +} + +// Response for getting a single fct_block_first_seen_by_node_monthly record +type GetFctBlockFirstSeenByNodeMonthlyResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Item *FctBlockFirstSeenByNodeMonthly `protobuf:"bytes,1,opt,name=item,proto3" json:"item,omitempty"` +} + +func (x *GetFctBlockFirstSeenByNodeMonthlyResponse) Reset() { + *x = GetFctBlockFirstSeenByNodeMonthlyResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_fct_block_first_seen_by_node_monthly_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetFctBlockFirstSeenByNodeMonthlyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetFctBlockFirstSeenByNodeMonthlyResponse) ProtoMessage() {} + +func (x *GetFctBlockFirstSeenByNodeMonthlyResponse) ProtoReflect() protoreflect.Message { + mi := &file_fct_block_first_seen_by_node_monthly_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetFctBlockFirstSeenByNodeMonthlyResponse.ProtoReflect.Descriptor instead. +func (*GetFctBlockFirstSeenByNodeMonthlyResponse) Descriptor() ([]byte, []int) { + return file_fct_block_first_seen_by_node_monthly_proto_rawDescGZIP(), []int{4} +} + +func (x *GetFctBlockFirstSeenByNodeMonthlyResponse) GetItem() *FctBlockFirstSeenByNodeMonthly { + if x != nil { + return x.Item + } + return nil +} + +var File_fct_block_first_seen_by_node_monthly_proto protoreflect.FileDescriptor + +var file_fct_block_first_seen_by_node_monthly_proto_rawDesc = []byte{ + 0x0a, 0x2a, 0x66, 0x63, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x66, 0x69, 0x72, 0x73, + 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x62, 0x79, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, + 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x03, 0x63, 0x62, + 0x74, 0x1a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, + 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, + 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, + 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, + 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xe7, 0x0c, 0x0a, + 0x1e, 0x46, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x72, 0x73, 0x74, 0x53, 0x65, + 0x65, 0x6e, 0x42, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x12, + 0x2a, 0x0a, 0x11, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x64, 0x44, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6d, + 0x6f, 0x6e, 0x74, 0x68, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6d, 0x6f, 0x6e, 0x74, + 0x68, 0x12, 0x31, 0x0a, 0x15, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x5f, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x12, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x61, 0x74, 0x65, + 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6d, 0x65, 0x74, + 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3c, 0x0a, 0x1a, 0x6d, + 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6d, 0x70, 0x6c, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x18, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6d, 0x70, 0x6c, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x14, 0x6d, 0x65, 0x74, + 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x63, 0x69, 0x74, + 0x79, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x47, 0x65, 0x6f, 0x43, 0x69, 0x74, 0x79, 0x12, 0x35, 0x0a, 0x17, 0x6d, 0x65, + 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x6d, 0x65, 0x74, + 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x47, 0x65, 0x6f, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x3e, 0x0a, 0x1c, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x64, + 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x18, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x47, 0x65, 0x6f, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x64, + 0x65, 0x12, 0x42, 0x0a, 0x1e, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x63, + 0x6f, 0x64, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1a, 0x6d, 0x65, 0x74, 0x61, 0x43, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x47, 0x65, 0x6f, 0x43, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x65, 0x6e, + 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x57, 0x0a, 0x19, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, + 0x64, 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x6f, 0x75, 0x62, 0x6c, + 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x16, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x47, 0x65, 0x6f, 0x4c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x55, + 0x0a, 0x18, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x65, + 0x6f, 0x5f, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x15, + 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x47, 0x65, 0x6f, 0x4c, 0x61, 0x74, + 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x73, 0x0a, 0x28, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x6e, 0x6f, 0x6d, + 0x6f, 0x75, 0x73, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x23, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x47, 0x65, 0x6f, 0x41, 0x75, 0x74, 0x6f, 0x6e, 0x6f, 0x6d, 0x6f, 0x75, 0x73, 0x53, 0x79, + 0x73, 0x74, 0x65, 0x6d, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x7f, 0x0a, 0x2e, 0x6d, 0x65, + 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x61, 0x75, + 0x74, 0x6f, 0x6e, 0x6f, 0x6d, 0x6f, 0x75, 0x73, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, + 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x1a, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x52, 0x29, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x47, 0x65, 0x6f, 0x41, + 0x75, 0x74, 0x6f, 0x6e, 0x6f, 0x6d, 0x6f, 0x75, 0x73, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4f, + 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x6d, + 0x69, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x6d, + 0x69, 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x6c, + 0x6f, 0x74, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x53, 0x6c, 0x6f, + 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x61, 0x79, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x1d, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x64, 0x61, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1f, + 0x0a, 0x0b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x1e, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x1d, 0x0a, 0x0a, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x1f, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x09, 0x73, 0x6c, 0x6f, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3b, + 0x0a, 0x1b, 0x6d, 0x69, 0x6e, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x20, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x16, 0x6d, 0x69, 0x6e, 0x53, 0x65, 0x65, 0x6e, 0x53, 0x6c, 0x6f, 0x74, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x69, 0x66, 0x66, 0x4d, 0x73, 0x12, 0x3b, 0x0a, 0x1b, 0x70, + 0x30, 0x35, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x21, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x16, 0x70, 0x30, 0x35, 0x53, 0x65, 0x65, 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x44, 0x69, 0x66, 0x66, 0x4d, 0x73, 0x12, 0x3b, 0x0a, 0x1b, 0x70, 0x35, 0x30, 0x5f, + 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, + 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x16, 0x70, + 0x35, 0x30, 0x53, 0x65, 0x65, 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, + 0x69, 0x66, 0x66, 0x4d, 0x73, 0x12, 0x3b, 0x0a, 0x1b, 0x61, 0x76, 0x67, 0x5f, 0x73, 0x65, 0x65, + 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, + 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x23, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x16, 0x61, 0x76, 0x67, 0x53, + 0x65, 0x65, 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x69, 0x66, 0x66, + 0x4d, 0x73, 0x12, 0x3b, 0x0a, 0x1b, 0x70, 0x39, 0x30, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, + 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, + 0x73, 0x18, 0x24, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x16, 0x70, 0x39, 0x30, 0x53, 0x65, 0x65, 0x6e, + 0x53, 0x6c, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x69, 0x66, 0x66, 0x4d, 0x73, 0x12, + 0x3b, 0x0a, 0x1b, 0x70, 0x39, 0x35, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, + 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x25, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x16, 0x70, 0x39, 0x35, 0x53, 0x65, 0x65, 0x6e, 0x53, 0x6c, 0x6f, + 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x69, 0x66, 0x66, 0x4d, 0x73, 0x12, 0x3b, 0x0a, 0x1b, + 0x70, 0x39, 0x39, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x26, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x16, 0x70, 0x39, 0x39, 0x53, 0x65, 0x65, 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x44, 0x69, 0x66, 0x66, 0x4d, 0x73, 0x12, 0x3b, 0x0a, 0x1b, 0x6d, 0x61, 0x78, + 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x27, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x16, + 0x6d, 0x61, 0x78, 0x53, 0x65, 0x65, 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x44, 0x69, 0x66, 0x66, 0x4d, 0x73, 0x22, 0xce, 0x12, 0x0a, 0x29, 0x4c, 0x69, 0x73, 0x74, 0x46, + 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x72, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, + 0x42, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x3b, 0x0a, 0x05, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, + 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x12, 0xe0, 0x41, 0x02, 0x9a, 0xb5, 0x18, 0x0b, 0x70, + 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x52, 0x05, 0x6d, 0x6f, 0x6e, 0x74, + 0x68, 0x12, 0x40, 0x0a, 0x10, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, + 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, + 0xe0, 0x41, 0x01, 0x52, 0x0e, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x42, 0x0a, 0x11, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x64, + 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, + 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x44, + 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x49, 0x0a, 0x15, 0x6d, 0x6f, 0x6e, 0x74, 0x68, + 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x55, 0x49, 0x6e, + 0x74, 0x33, 0x32, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x12, + 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x61, 0x74, 0x65, 0x54, 0x69, + 0x6d, 0x65, 0x12, 0x32, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x08, 0x75, 0x73, + 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, + 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, + 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x0e, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x54, 0x0a, 0x1a, 0x6d, 0x65, 0x74, 0x61, 0x5f, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, + 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, + 0xe0, 0x41, 0x01, 0x52, 0x18, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, + 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x47, 0x0a, + 0x14, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x65, 0x6f, + 0x5f, 0x63, 0x69, 0x74, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, + 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, + 0xe0, 0x41, 0x01, 0x52, 0x11, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x47, + 0x65, 0x6f, 0x43, 0x69, 0x74, 0x79, 0x12, 0x4d, 0x0a, 0x17, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, + 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, + 0x14, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x47, 0x65, 0x6f, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x56, 0x0a, 0x1c, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, + 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, + 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, + 0xe0, 0x41, 0x01, 0x52, 0x18, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x47, + 0x65, 0x6f, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x5a, 0x0a, + 0x1e, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x65, 0x6f, + 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x1a, 0x6d, + 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x47, 0x65, 0x6f, 0x43, 0x6f, 0x6e, 0x74, + 0x69, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x5c, 0x0a, 0x19, 0x6d, 0x65, 0x74, + 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x6c, 0x6f, 0x6e, + 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, + 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, + 0x16, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x47, 0x65, 0x6f, 0x4c, 0x6f, + 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x5a, 0x0a, 0x18, 0x6d, 0x65, 0x74, 0x61, 0x5f, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x6c, 0x61, 0x74, 0x69, 0x74, + 0x75, 0x64, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x6f, 0x75, 0x62, + 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x15, 0x6d, 0x65, + 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x47, 0x65, 0x6f, 0x4c, 0x61, 0x74, 0x69, 0x74, + 0x75, 0x64, 0x65, 0x12, 0x75, 0x0a, 0x28, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x6e, 0x6f, 0x6d, 0x6f, 0x75, + 0x73, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, + 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x23, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x47, 0x65, 0x6f, 0x41, 0x75, 0x74, 0x6f, 0x6e, 0x6f, 0x6d, 0x6f, 0x75, 0x73, 0x53, 0x79, + 0x73, 0x74, 0x65, 0x6d, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x81, 0x01, 0x0a, 0x2e, 0x6d, + 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x61, + 0x75, 0x74, 0x6f, 0x6e, 0x6f, 0x6d, 0x6f, 0x75, 0x73, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, + 0x5f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, + 0xe0, 0x41, 0x01, 0x52, 0x29, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x47, + 0x65, 0x6f, 0x41, 0x75, 0x74, 0x6f, 0x6e, 0x6f, 0x6d, 0x6f, 0x75, 0x73, 0x53, 0x79, 0x73, 0x74, + 0x65, 0x6d, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x31, + 0x0a, 0x08, 0x6d, 0x69, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x07, 0x6d, 0x69, 0x6e, 0x53, 0x6c, 0x6f, + 0x74, 0x12, 0x31, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x12, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, + 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x07, 0x6d, 0x61, 0x78, + 0x53, 0x6c, 0x6f, 0x74, 0x12, 0x33, 0x0a, 0x09, 0x64, 0x61, 0x79, 0x5f, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x55, 0x49, + 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, + 0x08, 0x64, 0x61, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x37, 0x0a, 0x0b, 0x65, 0x70, 0x6f, + 0x63, 0x68, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, + 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0a, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x12, 0x35, 0x0a, 0x0a, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x55, 0x49, 0x6e, + 0x74, 0x33, 0x32, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, + 0x73, 0x6c, 0x6f, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x53, 0x0a, 0x1b, 0x6d, 0x69, 0x6e, + 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, + 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x16, 0x6d, 0x69, 0x6e, 0x53, 0x65, 0x65, 0x6e, 0x53, + 0x6c, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x69, 0x66, 0x66, 0x4d, 0x73, 0x12, 0x53, + 0x0a, 0x1b, 0x70, 0x30, 0x35, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x17, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, + 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x16, 0x70, 0x30, 0x35, + 0x53, 0x65, 0x65, 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x69, 0x66, + 0x66, 0x4d, 0x73, 0x12, 0x53, 0x0a, 0x1b, 0x70, 0x35, 0x30, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, + 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, + 0x6d, 0x73, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x55, + 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, + 0x52, 0x16, 0x70, 0x35, 0x30, 0x53, 0x65, 0x65, 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x44, 0x69, 0x66, 0x66, 0x4d, 0x73, 0x12, 0x53, 0x0a, 0x1b, 0x61, 0x76, 0x67, 0x5f, + 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, + 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, + 0x63, 0x62, 0x74, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x16, 0x61, 0x76, 0x67, 0x53, 0x65, 0x65, 0x6e, 0x53, 0x6c, + 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x69, 0x66, 0x66, 0x4d, 0x73, 0x12, 0x53, 0x0a, + 0x1b, 0x70, 0x39, 0x30, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x1a, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x16, 0x70, 0x39, 0x30, 0x53, + 0x65, 0x65, 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x69, 0x66, 0x66, + 0x4d, 0x73, 0x12, 0x53, 0x0a, 0x1b, 0x70, 0x39, 0x35, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, + 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, + 0x73, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x55, 0x49, + 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, + 0x16, 0x70, 0x39, 0x35, 0x53, 0x65, 0x65, 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x44, 0x69, 0x66, 0x66, 0x4d, 0x73, 0x12, 0x53, 0x0a, 0x1b, 0x70, 0x39, 0x39, 0x5f, 0x73, + 0x65, 0x65, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, + 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, + 0x62, 0x74, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, + 0x03, 0xe0, 0x41, 0x01, 0x52, 0x16, 0x70, 0x39, 0x39, 0x53, 0x65, 0x65, 0x6e, 0x53, 0x6c, 0x6f, + 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x69, 0x66, 0x66, 0x4d, 0x73, 0x12, 0x53, 0x0a, 0x1b, + 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x1d, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x16, 0x6d, 0x61, 0x78, 0x53, 0x65, + 0x65, 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x69, 0x66, 0x66, 0x4d, + 0x73, 0x12, 0x20, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x1e, + 0x20, 0x01, 0x28, 0x05, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, + 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x70, 0x61, + 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1e, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x5f, 0x62, 0x79, 0x18, 0x20, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x07, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x22, 0xc7, 0x01, 0x0a, 0x2a, 0x4c, 0x69, 0x73, 0x74, + 0x46, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x72, 0x73, 0x74, 0x53, 0x65, 0x65, + 0x6e, 0x42, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x71, 0x0a, 0x24, 0x66, 0x63, 0x74, 0x5f, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x5f, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x62, + 0x79, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x46, 0x63, 0x74, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x72, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x42, 0x79, 0x4e, 0x6f, + 0x64, 0x65, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x52, 0x1e, 0x66, 0x63, 0x74, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x72, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x42, 0x79, 0x4e, 0x6f, + 0x64, 0x65, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, + 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x22, 0x40, 0x0a, 0x28, 0x47, 0x65, 0x74, 0x46, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x46, 0x69, 0x72, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x42, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x4d, + 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6d, 0x6f, + 0x6e, 0x74, 0x68, 0x22, 0x64, 0x0a, 0x29, 0x47, 0x65, 0x74, 0x46, 0x63, 0x74, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x46, 0x69, 0x72, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x42, 0x79, 0x4e, 0x6f, 0x64, + 0x65, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x37, 0x0a, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, + 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x46, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x72, + 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x42, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x6f, 0x6e, 0x74, + 0x68, 0x6c, 0x79, 0x52, 0x04, 0x69, 0x74, 0x65, 0x6d, 0x32, 0xec, 0x02, 0x0a, 0x25, 0x46, 0x63, + 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x72, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x42, + 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x12, 0x9d, 0x01, 0x0a, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2e, 0x2e, 0x63, + 0x62, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, + 0x69, 0x72, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x42, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x6f, + 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x63, + 0x62, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, + 0x69, 0x72, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x42, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x6f, + 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x34, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x12, 0x2c, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x66, + 0x63, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x73, + 0x65, 0x65, 0x6e, 0x5f, 0x62, 0x79, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, + 0x68, 0x6c, 0x79, 0x12, 0xa2, 0x01, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x2d, 0x2e, 0x63, 0x62, + 0x74, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x72, + 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x42, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x6f, 0x6e, 0x74, + 0x68, 0x6c, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x63, 0x62, 0x74, + 0x2e, 0x47, 0x65, 0x74, 0x46, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x72, 0x73, + 0x74, 0x53, 0x65, 0x65, 0x6e, 0x42, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x6f, 0x6e, 0x74, 0x68, + 0x6c, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3c, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x36, 0x12, 0x34, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x66, 0x63, 0x74, 0x5f, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, + 0x5f, 0x62, 0x79, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, + 0x2f, 0x7b, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x7d, 0x42, 0x36, 0x5a, 0x34, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x74, 0x68, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x6f, + 0x70, 0x73, 0x2f, 0x78, 0x61, 0x74, 0x75, 0x2d, 0x63, 0x62, 0x74, 0x2f, 0x70, 0x6b, 0x67, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x68, 0x6f, 0x75, 0x73, 0x65, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_fct_block_first_seen_by_node_monthly_proto_rawDescOnce sync.Once + file_fct_block_first_seen_by_node_monthly_proto_rawDescData = file_fct_block_first_seen_by_node_monthly_proto_rawDesc +) + +func file_fct_block_first_seen_by_node_monthly_proto_rawDescGZIP() []byte { + file_fct_block_first_seen_by_node_monthly_proto_rawDescOnce.Do(func() { + file_fct_block_first_seen_by_node_monthly_proto_rawDescData = protoimpl.X.CompressGZIP(file_fct_block_first_seen_by_node_monthly_proto_rawDescData) + }) + return file_fct_block_first_seen_by_node_monthly_proto_rawDescData +} + +var file_fct_block_first_seen_by_node_monthly_proto_msgTypes = make([]protoimpl.MessageInfo, 5) +var file_fct_block_first_seen_by_node_monthly_proto_goTypes = []any{ + (*FctBlockFirstSeenByNodeMonthly)(nil), // 0: cbt.FctBlockFirstSeenByNodeMonthly + (*ListFctBlockFirstSeenByNodeMonthlyRequest)(nil), // 1: cbt.ListFctBlockFirstSeenByNodeMonthlyRequest + (*ListFctBlockFirstSeenByNodeMonthlyResponse)(nil), // 2: cbt.ListFctBlockFirstSeenByNodeMonthlyResponse + (*GetFctBlockFirstSeenByNodeMonthlyRequest)(nil), // 3: cbt.GetFctBlockFirstSeenByNodeMonthlyRequest + (*GetFctBlockFirstSeenByNodeMonthlyResponse)(nil), // 4: cbt.GetFctBlockFirstSeenByNodeMonthlyResponse + (*wrapperspb.DoubleValue)(nil), // 5: google.protobuf.DoubleValue + (*wrapperspb.UInt32Value)(nil), // 6: google.protobuf.UInt32Value + (*wrapperspb.StringValue)(nil), // 7: google.protobuf.StringValue + (*UInt32Filter)(nil), // 8: cbt.UInt32Filter + (*StringFilter)(nil), // 9: cbt.StringFilter + (*NullableUInt32Filter)(nil), // 10: cbt.NullableUInt32Filter + (*NullableStringFilter)(nil), // 11: cbt.NullableStringFilter + (*UInt64Filter)(nil), // 12: cbt.UInt64Filter +} +var file_fct_block_first_seen_by_node_monthly_proto_depIdxs = []int32{ + 5, // 0: cbt.FctBlockFirstSeenByNodeMonthly.meta_client_geo_longitude:type_name -> google.protobuf.DoubleValue + 5, // 1: cbt.FctBlockFirstSeenByNodeMonthly.meta_client_geo_latitude:type_name -> google.protobuf.DoubleValue + 6, // 2: cbt.FctBlockFirstSeenByNodeMonthly.meta_client_geo_autonomous_system_number:type_name -> google.protobuf.UInt32Value + 7, // 3: cbt.FctBlockFirstSeenByNodeMonthly.meta_client_geo_autonomous_system_organization:type_name -> google.protobuf.StringValue + 8, // 4: cbt.ListFctBlockFirstSeenByNodeMonthlyRequest.month:type_name -> cbt.UInt32Filter + 9, // 5: cbt.ListFctBlockFirstSeenByNodeMonthlyRequest.meta_client_name:type_name -> cbt.StringFilter + 8, // 6: cbt.ListFctBlockFirstSeenByNodeMonthlyRequest.updated_date_time:type_name -> cbt.UInt32Filter + 8, // 7: cbt.ListFctBlockFirstSeenByNodeMonthlyRequest.month_start_date_time:type_name -> cbt.UInt32Filter + 9, // 8: cbt.ListFctBlockFirstSeenByNodeMonthlyRequest.username:type_name -> cbt.StringFilter + 9, // 9: cbt.ListFctBlockFirstSeenByNodeMonthlyRequest.node_id:type_name -> cbt.StringFilter + 9, // 10: cbt.ListFctBlockFirstSeenByNodeMonthlyRequest.classification:type_name -> cbt.StringFilter + 9, // 11: cbt.ListFctBlockFirstSeenByNodeMonthlyRequest.meta_client_implementation:type_name -> cbt.StringFilter + 9, // 12: cbt.ListFctBlockFirstSeenByNodeMonthlyRequest.meta_client_geo_city:type_name -> cbt.StringFilter + 9, // 13: cbt.ListFctBlockFirstSeenByNodeMonthlyRequest.meta_client_geo_country:type_name -> cbt.StringFilter + 9, // 14: cbt.ListFctBlockFirstSeenByNodeMonthlyRequest.meta_client_geo_country_code:type_name -> cbt.StringFilter + 9, // 15: cbt.ListFctBlockFirstSeenByNodeMonthlyRequest.meta_client_geo_continent_code:type_name -> cbt.StringFilter + 5, // 16: cbt.ListFctBlockFirstSeenByNodeMonthlyRequest.meta_client_geo_longitude:type_name -> google.protobuf.DoubleValue + 5, // 17: cbt.ListFctBlockFirstSeenByNodeMonthlyRequest.meta_client_geo_latitude:type_name -> google.protobuf.DoubleValue + 10, // 18: cbt.ListFctBlockFirstSeenByNodeMonthlyRequest.meta_client_geo_autonomous_system_number:type_name -> cbt.NullableUInt32Filter + 11, // 19: cbt.ListFctBlockFirstSeenByNodeMonthlyRequest.meta_client_geo_autonomous_system_organization:type_name -> cbt.NullableStringFilter + 12, // 20: cbt.ListFctBlockFirstSeenByNodeMonthlyRequest.min_slot:type_name -> cbt.UInt64Filter + 12, // 21: cbt.ListFctBlockFirstSeenByNodeMonthlyRequest.max_slot:type_name -> cbt.UInt64Filter + 8, // 22: cbt.ListFctBlockFirstSeenByNodeMonthlyRequest.day_count:type_name -> cbt.UInt32Filter + 8, // 23: cbt.ListFctBlockFirstSeenByNodeMonthlyRequest.epoch_count:type_name -> cbt.UInt32Filter + 8, // 24: cbt.ListFctBlockFirstSeenByNodeMonthlyRequest.slot_count:type_name -> cbt.UInt32Filter + 8, // 25: cbt.ListFctBlockFirstSeenByNodeMonthlyRequest.min_seen_slot_start_diff_ms:type_name -> cbt.UInt32Filter + 8, // 26: cbt.ListFctBlockFirstSeenByNodeMonthlyRequest.p05_seen_slot_start_diff_ms:type_name -> cbt.UInt32Filter + 8, // 27: cbt.ListFctBlockFirstSeenByNodeMonthlyRequest.p50_seen_slot_start_diff_ms:type_name -> cbt.UInt32Filter + 8, // 28: cbt.ListFctBlockFirstSeenByNodeMonthlyRequest.avg_seen_slot_start_diff_ms:type_name -> cbt.UInt32Filter + 8, // 29: cbt.ListFctBlockFirstSeenByNodeMonthlyRequest.p90_seen_slot_start_diff_ms:type_name -> cbt.UInt32Filter + 8, // 30: cbt.ListFctBlockFirstSeenByNodeMonthlyRequest.p95_seen_slot_start_diff_ms:type_name -> cbt.UInt32Filter + 8, // 31: cbt.ListFctBlockFirstSeenByNodeMonthlyRequest.p99_seen_slot_start_diff_ms:type_name -> cbt.UInt32Filter + 8, // 32: cbt.ListFctBlockFirstSeenByNodeMonthlyRequest.max_seen_slot_start_diff_ms:type_name -> cbt.UInt32Filter + 0, // 33: cbt.ListFctBlockFirstSeenByNodeMonthlyResponse.fct_block_first_seen_by_node_monthly:type_name -> cbt.FctBlockFirstSeenByNodeMonthly + 0, // 34: cbt.GetFctBlockFirstSeenByNodeMonthlyResponse.item:type_name -> cbt.FctBlockFirstSeenByNodeMonthly + 1, // 35: cbt.FctBlockFirstSeenByNodeMonthlyService.List:input_type -> cbt.ListFctBlockFirstSeenByNodeMonthlyRequest + 3, // 36: cbt.FctBlockFirstSeenByNodeMonthlyService.Get:input_type -> cbt.GetFctBlockFirstSeenByNodeMonthlyRequest + 2, // 37: cbt.FctBlockFirstSeenByNodeMonthlyService.List:output_type -> cbt.ListFctBlockFirstSeenByNodeMonthlyResponse + 4, // 38: cbt.FctBlockFirstSeenByNodeMonthlyService.Get:output_type -> cbt.GetFctBlockFirstSeenByNodeMonthlyResponse + 37, // [37:39] is the sub-list for method output_type + 35, // [35:37] is the sub-list for method input_type + 35, // [35:35] is the sub-list for extension type_name + 35, // [35:35] is the sub-list for extension extendee + 0, // [0:35] is the sub-list for field type_name +} + +func init() { file_fct_block_first_seen_by_node_monthly_proto_init() } +func file_fct_block_first_seen_by_node_monthly_proto_init() { + if File_fct_block_first_seen_by_node_monthly_proto != nil { + return + } + file_common_proto_init() + if !protoimpl.UnsafeEnabled { + file_fct_block_first_seen_by_node_monthly_proto_msgTypes[0].Exporter = func(v any, i int) any { + switch v := v.(*FctBlockFirstSeenByNodeMonthly); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_fct_block_first_seen_by_node_monthly_proto_msgTypes[1].Exporter = func(v any, i int) any { + switch v := v.(*ListFctBlockFirstSeenByNodeMonthlyRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_fct_block_first_seen_by_node_monthly_proto_msgTypes[2].Exporter = func(v any, i int) any { + switch v := v.(*ListFctBlockFirstSeenByNodeMonthlyResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_fct_block_first_seen_by_node_monthly_proto_msgTypes[3].Exporter = func(v any, i int) any { + switch v := v.(*GetFctBlockFirstSeenByNodeMonthlyRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_fct_block_first_seen_by_node_monthly_proto_msgTypes[4].Exporter = func(v any, i int) any { + switch v := v.(*GetFctBlockFirstSeenByNodeMonthlyResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_fct_block_first_seen_by_node_monthly_proto_rawDesc, + NumEnums: 0, + NumMessages: 5, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_fct_block_first_seen_by_node_monthly_proto_goTypes, + DependencyIndexes: file_fct_block_first_seen_by_node_monthly_proto_depIdxs, + MessageInfos: file_fct_block_first_seen_by_node_monthly_proto_msgTypes, + }.Build() + File_fct_block_first_seen_by_node_monthly_proto = out.File + file_fct_block_first_seen_by_node_monthly_proto_rawDesc = nil + file_fct_block_first_seen_by_node_monthly_proto_goTypes = nil + file_fct_block_first_seen_by_node_monthly_proto_depIdxs = nil +} diff --git a/pkg/proto/clickhouse/fct_block_first_seen_by_node_monthly.proto b/pkg/proto/clickhouse/fct_block_first_seen_by_node_monthly.proto new file mode 100644 index 00000000..5ef4e3eb --- /dev/null +++ b/pkg/proto/clickhouse/fct_block_first_seen_by_node_monthly.proto @@ -0,0 +1,185 @@ +syntax = "proto3"; + +package cbt; + +import "common.proto"; +import "google/protobuf/wrappers.proto"; +import "google/api/annotations.proto"; +import "google/api/field_behavior.proto"; +import "clickhouse/annotations.proto"; + +option go_package = "github.com/ethpandaops/xatu-cbt/pkg/proto/clickhouse"; +// Block first seen statistics by node aggregated by month + +message FctBlockFirstSeenByNodeMonthly { + // Timestamp when the record was last updated + uint32 updated_date_time = 11; + // Year and month in YYYYMM format (e.g., 202507) + uint32 month = 12; + // Start of month at midnight UTC + uint32 month_start_date_time = 13; + // Username of the node + string username = 14; + // ID of the node + string node_id = 15; + // Classification of the node, e.g. "individual", "corporate", "internal" (aka ethPandaOps) or "unclassified" + string classification = 16; + // Name of the client + string meta_client_name = 17; + // Implementation of the client + string meta_client_implementation = 18; + // City of the client + string meta_client_geo_city = 19; + // Country of the client + string meta_client_geo_country = 20; + // Country code of the client + string meta_client_geo_country_code = 21; + // Continent code of the client + string meta_client_geo_continent_code = 22; + // Longitude of the client + google.protobuf.DoubleValue meta_client_geo_longitude = 23; + // Latitude of the client + google.protobuf.DoubleValue meta_client_geo_latitude = 24; + // Autonomous system number of the client + google.protobuf.UInt32Value meta_client_geo_autonomous_system_number = 25; + // Autonomous system organization of the client + google.protobuf.StringValue meta_client_geo_autonomous_system_organization = 26; + // Minimum slot number in this month + uint64 min_slot = 27; + // Maximum slot number in this month + uint64 max_slot = 28; + // Number of days in this month + uint32 day_count = 29; + // Number of epochs in this month + uint32 epoch_count = 30; + // Number of slots with blocks seen in this month + uint32 slot_count = 31; + // Minimum time from slot start for the node to see a block (milliseconds) + uint32 min_seen_slot_start_diff_ms = 32; + // 5th percentile time from slot start (milliseconds) + uint32 p05_seen_slot_start_diff_ms = 33; + // Median (p50) time from slot start (milliseconds) + uint32 p50_seen_slot_start_diff_ms = 34; + // Average time from slot start (milliseconds) + uint32 avg_seen_slot_start_diff_ms = 35; + // 90th percentile time from slot start (milliseconds) + uint32 p90_seen_slot_start_diff_ms = 36; + // 95th percentile time from slot start (milliseconds) + uint32 p95_seen_slot_start_diff_ms = 37; + // 99th percentile time from slot start (milliseconds) + uint32 p99_seen_slot_start_diff_ms = 38; + // Maximum time from slot start (milliseconds) + uint32 max_seen_slot_start_diff_ms = 39; +} + +// Request for listing fct_block_first_seen_by_node_monthly records +message ListFctBlockFirstSeenByNodeMonthlyRequest { + // Filter by month - Year and month in YYYYMM format (e.g., 202507) (PRIMARY KEY - required) + UInt32Filter month = 1 [(google.api.field_behavior) = REQUIRED, (clickhouse.v1.required_group) = "primary_key"]; + + // Filter by meta_client_name - Name of the client (ORDER BY column 2 - optional) + StringFilter meta_client_name = 2 [(google.api.field_behavior) = OPTIONAL]; + + // Filter by updated_date_time - Timestamp when the record was last updated (optional) + UInt32Filter updated_date_time = 3 [(google.api.field_behavior) = OPTIONAL]; + // Filter by month_start_date_time - Start of month at midnight UTC (optional) + UInt32Filter month_start_date_time = 4 [(google.api.field_behavior) = OPTIONAL]; + // Filter by username - Username of the node (optional) + StringFilter username = 5 [(google.api.field_behavior) = OPTIONAL]; + // Filter by node_id - ID of the node (optional) + StringFilter node_id = 6 [(google.api.field_behavior) = OPTIONAL]; + // Filter by classification - Classification of the node, e.g. "individual", "corporate", "internal" (aka ethPandaOps) or "unclassified" (optional) + StringFilter classification = 7 [(google.api.field_behavior) = OPTIONAL]; + // Filter by meta_client_implementation - Implementation of the client (optional) + StringFilter meta_client_implementation = 8 [(google.api.field_behavior) = OPTIONAL]; + // Filter by meta_client_geo_city - City of the client (optional) + StringFilter meta_client_geo_city = 9 [(google.api.field_behavior) = OPTIONAL]; + // Filter by meta_client_geo_country - Country of the client (optional) + StringFilter meta_client_geo_country = 10 [(google.api.field_behavior) = OPTIONAL]; + // Filter by meta_client_geo_country_code - Country code of the client (optional) + StringFilter meta_client_geo_country_code = 11 [(google.api.field_behavior) = OPTIONAL]; + // Filter by meta_client_geo_continent_code - Continent code of the client (optional) + StringFilter meta_client_geo_continent_code = 12 [(google.api.field_behavior) = OPTIONAL]; + // Filter by meta_client_geo_longitude - Longitude of the client (optional) + google.protobuf.DoubleValue meta_client_geo_longitude = 13 [(google.api.field_behavior) = OPTIONAL]; + // Filter by meta_client_geo_latitude - Latitude of the client (optional) + google.protobuf.DoubleValue meta_client_geo_latitude = 14 [(google.api.field_behavior) = OPTIONAL]; + // Filter by meta_client_geo_autonomous_system_number - Autonomous system number of the client (optional) + NullableUInt32Filter meta_client_geo_autonomous_system_number = 15 [(google.api.field_behavior) = OPTIONAL]; + // Filter by meta_client_geo_autonomous_system_organization - Autonomous system organization of the client (optional) + NullableStringFilter meta_client_geo_autonomous_system_organization = 16 [(google.api.field_behavior) = OPTIONAL]; + // Filter by min_slot - Minimum slot number in this month (optional) + UInt64Filter min_slot = 17 [(google.api.field_behavior) = OPTIONAL]; + // Filter by max_slot - Maximum slot number in this month (optional) + UInt64Filter max_slot = 18 [(google.api.field_behavior) = OPTIONAL]; + // Filter by day_count - Number of days in this month (optional) + UInt32Filter day_count = 19 [(google.api.field_behavior) = OPTIONAL]; + // Filter by epoch_count - Number of epochs in this month (optional) + UInt32Filter epoch_count = 20 [(google.api.field_behavior) = OPTIONAL]; + // Filter by slot_count - Number of slots with blocks seen in this month (optional) + UInt32Filter slot_count = 21 [(google.api.field_behavior) = OPTIONAL]; + // Filter by min_seen_slot_start_diff_ms - Minimum time from slot start for the node to see a block (milliseconds) (optional) + UInt32Filter min_seen_slot_start_diff_ms = 22 [(google.api.field_behavior) = OPTIONAL]; + // Filter by p05_seen_slot_start_diff_ms - 5th percentile time from slot start (milliseconds) (optional) + UInt32Filter p05_seen_slot_start_diff_ms = 23 [(google.api.field_behavior) = OPTIONAL]; + // Filter by p50_seen_slot_start_diff_ms - Median (p50) time from slot start (milliseconds) (optional) + UInt32Filter p50_seen_slot_start_diff_ms = 24 [(google.api.field_behavior) = OPTIONAL]; + // Filter by avg_seen_slot_start_diff_ms - Average time from slot start (milliseconds) (optional) + UInt32Filter avg_seen_slot_start_diff_ms = 25 [(google.api.field_behavior) = OPTIONAL]; + // Filter by p90_seen_slot_start_diff_ms - 90th percentile time from slot start (milliseconds) (optional) + UInt32Filter p90_seen_slot_start_diff_ms = 26 [(google.api.field_behavior) = OPTIONAL]; + // Filter by p95_seen_slot_start_diff_ms - 95th percentile time from slot start (milliseconds) (optional) + UInt32Filter p95_seen_slot_start_diff_ms = 27 [(google.api.field_behavior) = OPTIONAL]; + // Filter by p99_seen_slot_start_diff_ms - 99th percentile time from slot start (milliseconds) (optional) + UInt32Filter p99_seen_slot_start_diff_ms = 28 [(google.api.field_behavior) = OPTIONAL]; + // Filter by max_seen_slot_start_diff_ms - Maximum time from slot start (milliseconds) (optional) + UInt32Filter max_seen_slot_start_diff_ms = 29 [(google.api.field_behavior) = OPTIONAL]; + + // The maximum number of fct_block_first_seen_by_node_monthly to return. + // If unspecified, at most 100 items will be returned. + // The maximum value is 10000; values above 10000 will be coerced to 10000. + int32 page_size = 30 [(google.api.field_behavior) = OPTIONAL]; + // A page token, received from a previous `ListFctBlockFirstSeenByNodeMonthly` call. + // Provide this to retrieve the subsequent page. + string page_token = 31 [(google.api.field_behavior) = OPTIONAL]; + // The order of results. Format: comma-separated list of fields. + // Example: "foo,bar" or "foo desc,bar" for descending order on foo. + // If unspecified, results will be returned in the default order. + string order_by = 32 [(google.api.field_behavior) = OPTIONAL]; +} + +// Response for listing fct_block_first_seen_by_node_monthly records +message ListFctBlockFirstSeenByNodeMonthlyResponse { + // The list of fct_block_first_seen_by_node_monthly. + repeated FctBlockFirstSeenByNodeMonthly fct_block_first_seen_by_node_monthly = 1; + // A token, which can be sent as `page_token` to retrieve the next page. + // If this field is omitted, there are no subsequent pages. + string next_page_token = 2; +} + +// Request for getting a single fct_block_first_seen_by_node_monthly record by primary key +message GetFctBlockFirstSeenByNodeMonthlyRequest { + // Year and month in YYYYMM format (e.g., 202507) + uint32 month = 1; // Primary key (required) +} + +// Response for getting a single fct_block_first_seen_by_node_monthly record +message GetFctBlockFirstSeenByNodeMonthlyResponse { + FctBlockFirstSeenByNodeMonthly item = 1; +} + +// Query fct_block_first_seen_by_node_monthly data +service FctBlockFirstSeenByNodeMonthlyService { + // List records | Retrieve paginated results with optional filtering + rpc List(ListFctBlockFirstSeenByNodeMonthlyRequest) returns (ListFctBlockFirstSeenByNodeMonthlyResponse) { + option (google.api.http) = { + get: "/api/v1/fct_block_first_seen_by_node_monthly" + }; + } + // Get record | Retrieve a single record by month + rpc Get(GetFctBlockFirstSeenByNodeMonthlyRequest) returns (GetFctBlockFirstSeenByNodeMonthlyResponse) { + option (google.api.http) = { + get: "/api/v1/fct_block_first_seen_by_node_monthly/{month}" + }; + } +} diff --git a/pkg/proto/clickhouse/fct_block_first_seen_by_node_weekly.go b/pkg/proto/clickhouse/fct_block_first_seen_by_node_weekly.go new file mode 100644 index 00000000..a5999505 --- /dev/null +++ b/pkg/proto/clickhouse/fct_block_first_seen_by_node_weekly.go @@ -0,0 +1,923 @@ +// Code generated by clickhouse-proto-gen. DO NOT EDIT. +// SQL query builder for fct_block_first_seen_by_node_weekly + +package clickhouse + +import ( + "fmt" +) + +// BuildListFctBlockFirstSeenByNodeWeeklyQuery constructs a parameterized SQL query from a ListFctBlockFirstSeenByNodeWeeklyRequest +// +// Available projections: +// - p_by_week_node (primary key: week) +// +// Use WithProjection() option to select a specific projection. +func BuildListFctBlockFirstSeenByNodeWeeklyQuery(req *ListFctBlockFirstSeenByNodeWeeklyRequest, options ...QueryOption) (SQLQuery, error) { + // Validate that at least one primary key is provided + // Primary keys can come from base table or projections + if req.Week == nil { + return SQLQuery{}, fmt.Errorf("primary key field week is required") + } + + // Build query using QueryBuilder + qb := NewQueryBuilder() + + // Add primary key filter + switch filter := req.Week.Filter.(type) { + case *StringFilter_Eq: + qb.AddCondition("week", "=", filter.Eq) + case *StringFilter_Ne: + qb.AddCondition("week", "!=", filter.Ne) + case *StringFilter_Contains: + qb.AddLikeCondition("week", "%" + filter.Contains + "%") + case *StringFilter_StartsWith: + qb.AddLikeCondition("week", filter.StartsWith + "%") + case *StringFilter_EndsWith: + qb.AddLikeCondition("week", "%" + filter.EndsWith) + case *StringFilter_Like: + qb.AddLikeCondition("week", filter.Like) + case *StringFilter_NotLike: + qb.AddNotLikeCondition("week", filter.NotLike) + case *StringFilter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("week", StringSliceToInterface(filter.In.Values)) + } + case *StringFilter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("week", StringSliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + + // Add filter for column: updated_date_time + if req.UpdatedDateTime != nil { + switch filter := req.UpdatedDateTime.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("updated_date_time", "=", DateTimeValue{filter.Eq}) + case *UInt32Filter_Ne: + qb.AddCondition("updated_date_time", "!=", DateTimeValue{filter.Ne}) + case *UInt32Filter_Lt: + qb.AddCondition("updated_date_time", "<", DateTimeValue{filter.Lt}) + case *UInt32Filter_Lte: + qb.AddCondition("updated_date_time", "<=", DateTimeValue{filter.Lte}) + case *UInt32Filter_Gt: + qb.AddCondition("updated_date_time", ">", DateTimeValue{filter.Gt}) + case *UInt32Filter_Gte: + qb.AddCondition("updated_date_time", ">=", DateTimeValue{filter.Gte}) + case *UInt32Filter_Between: + qb.AddBetweenCondition("updated_date_time", DateTimeValue{filter.Between.Min}, DateTimeValue{filter.Between.Max.GetValue()}) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + converted := make([]interface{}, len(filter.In.Values)) + for i, v := range filter.In.Values { + converted[i] = DateTimeValue{v} + } + qb.AddInCondition("updated_date_time", converted) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + converted := make([]interface{}, len(filter.NotIn.Values)) + for i, v := range filter.NotIn.Values { + converted[i] = DateTimeValue{v} + } + qb.AddNotInCondition("updated_date_time", converted) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: week_start_date_time + if req.WeekStartDateTime != nil { + switch filter := req.WeekStartDateTime.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("week_start_date_time", "=", DateTimeValue{filter.Eq}) + case *UInt32Filter_Ne: + qb.AddCondition("week_start_date_time", "!=", DateTimeValue{filter.Ne}) + case *UInt32Filter_Lt: + qb.AddCondition("week_start_date_time", "<", DateTimeValue{filter.Lt}) + case *UInt32Filter_Lte: + qb.AddCondition("week_start_date_time", "<=", DateTimeValue{filter.Lte}) + case *UInt32Filter_Gt: + qb.AddCondition("week_start_date_time", ">", DateTimeValue{filter.Gt}) + case *UInt32Filter_Gte: + qb.AddCondition("week_start_date_time", ">=", DateTimeValue{filter.Gte}) + case *UInt32Filter_Between: + qb.AddBetweenCondition("week_start_date_time", DateTimeValue{filter.Between.Min}, DateTimeValue{filter.Between.Max.GetValue()}) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + converted := make([]interface{}, len(filter.In.Values)) + for i, v := range filter.In.Values { + converted[i] = DateTimeValue{v} + } + qb.AddInCondition("week_start_date_time", converted) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + converted := make([]interface{}, len(filter.NotIn.Values)) + for i, v := range filter.NotIn.Values { + converted[i] = DateTimeValue{v} + } + qb.AddNotInCondition("week_start_date_time", converted) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: username + if req.Username != nil { + switch filter := req.Username.Filter.(type) { + case *StringFilter_Eq: + qb.AddCondition("username", "=", filter.Eq) + case *StringFilter_Ne: + qb.AddCondition("username", "!=", filter.Ne) + case *StringFilter_Contains: + qb.AddLikeCondition("username", "%" + filter.Contains + "%") + case *StringFilter_StartsWith: + qb.AddLikeCondition("username", filter.StartsWith + "%") + case *StringFilter_EndsWith: + qb.AddLikeCondition("username", "%" + filter.EndsWith) + case *StringFilter_Like: + qb.AddLikeCondition("username", filter.Like) + case *StringFilter_NotLike: + qb.AddNotLikeCondition("username", filter.NotLike) + case *StringFilter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("username", StringSliceToInterface(filter.In.Values)) + } + case *StringFilter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("username", StringSliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: node_id + if req.NodeId != nil { + switch filter := req.NodeId.Filter.(type) { + case *StringFilter_Eq: + qb.AddCondition("node_id", "=", filter.Eq) + case *StringFilter_Ne: + qb.AddCondition("node_id", "!=", filter.Ne) + case *StringFilter_Contains: + qb.AddLikeCondition("node_id", "%" + filter.Contains + "%") + case *StringFilter_StartsWith: + qb.AddLikeCondition("node_id", filter.StartsWith + "%") + case *StringFilter_EndsWith: + qb.AddLikeCondition("node_id", "%" + filter.EndsWith) + case *StringFilter_Like: + qb.AddLikeCondition("node_id", filter.Like) + case *StringFilter_NotLike: + qb.AddNotLikeCondition("node_id", filter.NotLike) + case *StringFilter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("node_id", StringSliceToInterface(filter.In.Values)) + } + case *StringFilter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("node_id", StringSliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: classification + if req.Classification != nil { + switch filter := req.Classification.Filter.(type) { + case *StringFilter_Eq: + qb.AddCondition("classification", "=", filter.Eq) + case *StringFilter_Ne: + qb.AddCondition("classification", "!=", filter.Ne) + case *StringFilter_Contains: + qb.AddLikeCondition("classification", "%" + filter.Contains + "%") + case *StringFilter_StartsWith: + qb.AddLikeCondition("classification", filter.StartsWith + "%") + case *StringFilter_EndsWith: + qb.AddLikeCondition("classification", "%" + filter.EndsWith) + case *StringFilter_Like: + qb.AddLikeCondition("classification", filter.Like) + case *StringFilter_NotLike: + qb.AddNotLikeCondition("classification", filter.NotLike) + case *StringFilter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("classification", StringSliceToInterface(filter.In.Values)) + } + case *StringFilter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("classification", StringSliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: meta_client_name + if req.MetaClientName != nil { + switch filter := req.MetaClientName.Filter.(type) { + case *StringFilter_Eq: + qb.AddCondition("meta_client_name", "=", filter.Eq) + case *StringFilter_Ne: + qb.AddCondition("meta_client_name", "!=", filter.Ne) + case *StringFilter_Contains: + qb.AddLikeCondition("meta_client_name", "%" + filter.Contains + "%") + case *StringFilter_StartsWith: + qb.AddLikeCondition("meta_client_name", filter.StartsWith + "%") + case *StringFilter_EndsWith: + qb.AddLikeCondition("meta_client_name", "%" + filter.EndsWith) + case *StringFilter_Like: + qb.AddLikeCondition("meta_client_name", filter.Like) + case *StringFilter_NotLike: + qb.AddNotLikeCondition("meta_client_name", filter.NotLike) + case *StringFilter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("meta_client_name", StringSliceToInterface(filter.In.Values)) + } + case *StringFilter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("meta_client_name", StringSliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: meta_client_implementation + if req.MetaClientImplementation != nil { + switch filter := req.MetaClientImplementation.Filter.(type) { + case *StringFilter_Eq: + qb.AddCondition("meta_client_implementation", "=", filter.Eq) + case *StringFilter_Ne: + qb.AddCondition("meta_client_implementation", "!=", filter.Ne) + case *StringFilter_Contains: + qb.AddLikeCondition("meta_client_implementation", "%" + filter.Contains + "%") + case *StringFilter_StartsWith: + qb.AddLikeCondition("meta_client_implementation", filter.StartsWith + "%") + case *StringFilter_EndsWith: + qb.AddLikeCondition("meta_client_implementation", "%" + filter.EndsWith) + case *StringFilter_Like: + qb.AddLikeCondition("meta_client_implementation", filter.Like) + case *StringFilter_NotLike: + qb.AddNotLikeCondition("meta_client_implementation", filter.NotLike) + case *StringFilter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("meta_client_implementation", StringSliceToInterface(filter.In.Values)) + } + case *StringFilter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("meta_client_implementation", StringSliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: meta_client_geo_city + if req.MetaClientGeoCity != nil { + switch filter := req.MetaClientGeoCity.Filter.(type) { + case *StringFilter_Eq: + qb.AddCondition("meta_client_geo_city", "=", filter.Eq) + case *StringFilter_Ne: + qb.AddCondition("meta_client_geo_city", "!=", filter.Ne) + case *StringFilter_Contains: + qb.AddLikeCondition("meta_client_geo_city", "%" + filter.Contains + "%") + case *StringFilter_StartsWith: + qb.AddLikeCondition("meta_client_geo_city", filter.StartsWith + "%") + case *StringFilter_EndsWith: + qb.AddLikeCondition("meta_client_geo_city", "%" + filter.EndsWith) + case *StringFilter_Like: + qb.AddLikeCondition("meta_client_geo_city", filter.Like) + case *StringFilter_NotLike: + qb.AddNotLikeCondition("meta_client_geo_city", filter.NotLike) + case *StringFilter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("meta_client_geo_city", StringSliceToInterface(filter.In.Values)) + } + case *StringFilter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("meta_client_geo_city", StringSliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: meta_client_geo_country + if req.MetaClientGeoCountry != nil { + switch filter := req.MetaClientGeoCountry.Filter.(type) { + case *StringFilter_Eq: + qb.AddCondition("meta_client_geo_country", "=", filter.Eq) + case *StringFilter_Ne: + qb.AddCondition("meta_client_geo_country", "!=", filter.Ne) + case *StringFilter_Contains: + qb.AddLikeCondition("meta_client_geo_country", "%" + filter.Contains + "%") + case *StringFilter_StartsWith: + qb.AddLikeCondition("meta_client_geo_country", filter.StartsWith + "%") + case *StringFilter_EndsWith: + qb.AddLikeCondition("meta_client_geo_country", "%" + filter.EndsWith) + case *StringFilter_Like: + qb.AddLikeCondition("meta_client_geo_country", filter.Like) + case *StringFilter_NotLike: + qb.AddNotLikeCondition("meta_client_geo_country", filter.NotLike) + case *StringFilter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("meta_client_geo_country", StringSliceToInterface(filter.In.Values)) + } + case *StringFilter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("meta_client_geo_country", StringSliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: meta_client_geo_country_code + if req.MetaClientGeoCountryCode != nil { + switch filter := req.MetaClientGeoCountryCode.Filter.(type) { + case *StringFilter_Eq: + qb.AddCondition("meta_client_geo_country_code", "=", filter.Eq) + case *StringFilter_Ne: + qb.AddCondition("meta_client_geo_country_code", "!=", filter.Ne) + case *StringFilter_Contains: + qb.AddLikeCondition("meta_client_geo_country_code", "%" + filter.Contains + "%") + case *StringFilter_StartsWith: + qb.AddLikeCondition("meta_client_geo_country_code", filter.StartsWith + "%") + case *StringFilter_EndsWith: + qb.AddLikeCondition("meta_client_geo_country_code", "%" + filter.EndsWith) + case *StringFilter_Like: + qb.AddLikeCondition("meta_client_geo_country_code", filter.Like) + case *StringFilter_NotLike: + qb.AddNotLikeCondition("meta_client_geo_country_code", filter.NotLike) + case *StringFilter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("meta_client_geo_country_code", StringSliceToInterface(filter.In.Values)) + } + case *StringFilter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("meta_client_geo_country_code", StringSliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: meta_client_geo_continent_code + if req.MetaClientGeoContinentCode != nil { + switch filter := req.MetaClientGeoContinentCode.Filter.(type) { + case *StringFilter_Eq: + qb.AddCondition("meta_client_geo_continent_code", "=", filter.Eq) + case *StringFilter_Ne: + qb.AddCondition("meta_client_geo_continent_code", "!=", filter.Ne) + case *StringFilter_Contains: + qb.AddLikeCondition("meta_client_geo_continent_code", "%" + filter.Contains + "%") + case *StringFilter_StartsWith: + qb.AddLikeCondition("meta_client_geo_continent_code", filter.StartsWith + "%") + case *StringFilter_EndsWith: + qb.AddLikeCondition("meta_client_geo_continent_code", "%" + filter.EndsWith) + case *StringFilter_Like: + qb.AddLikeCondition("meta_client_geo_continent_code", filter.Like) + case *StringFilter_NotLike: + qb.AddNotLikeCondition("meta_client_geo_continent_code", filter.NotLike) + case *StringFilter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("meta_client_geo_continent_code", StringSliceToInterface(filter.In.Values)) + } + case *StringFilter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("meta_client_geo_continent_code", StringSliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: meta_client_geo_longitude + + // Add filter for column: meta_client_geo_latitude + + // Add filter for column: meta_client_geo_autonomous_system_number + if req.MetaClientGeoAutonomousSystemNumber != nil { + switch filter := req.MetaClientGeoAutonomousSystemNumber.Filter.(type) { + case *NullableUInt32Filter_Eq: + qb.AddCondition("meta_client_geo_autonomous_system_number", "=", filter.Eq) + case *NullableUInt32Filter_Ne: + qb.AddCondition("meta_client_geo_autonomous_system_number", "!=", filter.Ne) + case *NullableUInt32Filter_Lt: + qb.AddCondition("meta_client_geo_autonomous_system_number", "<", filter.Lt) + case *NullableUInt32Filter_Lte: + qb.AddCondition("meta_client_geo_autonomous_system_number", "<=", filter.Lte) + case *NullableUInt32Filter_Gt: + qb.AddCondition("meta_client_geo_autonomous_system_number", ">", filter.Gt) + case *NullableUInt32Filter_Gte: + qb.AddCondition("meta_client_geo_autonomous_system_number", ">=", filter.Gte) + case *NullableUInt32Filter_Between: + qb.AddBetweenCondition("meta_client_geo_autonomous_system_number", filter.Between.Min, filter.Between.Max.GetValue()) + case *NullableUInt32Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("meta_client_geo_autonomous_system_number", UInt32SliceToInterface(filter.In.Values)) + } + case *NullableUInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("meta_client_geo_autonomous_system_number", UInt32SliceToInterface(filter.NotIn.Values)) + } + case *NullableUInt32Filter_IsNull: + qb.AddIsNullCondition("meta_client_geo_autonomous_system_number") + case *NullableUInt32Filter_IsNotNull: + qb.AddIsNotNullCondition("meta_client_geo_autonomous_system_number") + default: + // Unsupported filter type + } + } + + // Add filter for column: meta_client_geo_autonomous_system_organization + if req.MetaClientGeoAutonomousSystemOrganization != nil { + switch filter := req.MetaClientGeoAutonomousSystemOrganization.Filter.(type) { + case *NullableStringFilter_Eq: + qb.AddCondition("meta_client_geo_autonomous_system_organization", "=", filter.Eq) + case *NullableStringFilter_Ne: + qb.AddCondition("meta_client_geo_autonomous_system_organization", "!=", filter.Ne) + case *NullableStringFilter_Contains: + qb.AddLikeCondition("meta_client_geo_autonomous_system_organization", "%" + filter.Contains + "%") + case *NullableStringFilter_StartsWith: + qb.AddLikeCondition("meta_client_geo_autonomous_system_organization", filter.StartsWith + "%") + case *NullableStringFilter_EndsWith: + qb.AddLikeCondition("meta_client_geo_autonomous_system_organization", "%" + filter.EndsWith) + case *NullableStringFilter_Like: + qb.AddLikeCondition("meta_client_geo_autonomous_system_organization", filter.Like) + case *NullableStringFilter_NotLike: + qb.AddNotLikeCondition("meta_client_geo_autonomous_system_organization", filter.NotLike) + case *NullableStringFilter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("meta_client_geo_autonomous_system_organization", StringSliceToInterface(filter.In.Values)) + } + case *NullableStringFilter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("meta_client_geo_autonomous_system_organization", StringSliceToInterface(filter.NotIn.Values)) + } + case *NullableStringFilter_IsNull: + qb.AddIsNullCondition("meta_client_geo_autonomous_system_organization") + case *NullableStringFilter_IsNotNull: + qb.AddIsNotNullCondition("meta_client_geo_autonomous_system_organization") + default: + // Unsupported filter type + } + } + + // Add filter for column: min_slot + if req.MinSlot != nil { + switch filter := req.MinSlot.Filter.(type) { + case *UInt64Filter_Eq: + qb.AddCondition("min_slot", "=", filter.Eq) + case *UInt64Filter_Ne: + qb.AddCondition("min_slot", "!=", filter.Ne) + case *UInt64Filter_Lt: + qb.AddCondition("min_slot", "<", filter.Lt) + case *UInt64Filter_Lte: + qb.AddCondition("min_slot", "<=", filter.Lte) + case *UInt64Filter_Gt: + qb.AddCondition("min_slot", ">", filter.Gt) + case *UInt64Filter_Gte: + qb.AddCondition("min_slot", ">=", filter.Gte) + case *UInt64Filter_Between: + qb.AddBetweenCondition("min_slot", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt64Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("min_slot", UInt64SliceToInterface(filter.In.Values)) + } + case *UInt64Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("min_slot", UInt64SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: max_slot + if req.MaxSlot != nil { + switch filter := req.MaxSlot.Filter.(type) { + case *UInt64Filter_Eq: + qb.AddCondition("max_slot", "=", filter.Eq) + case *UInt64Filter_Ne: + qb.AddCondition("max_slot", "!=", filter.Ne) + case *UInt64Filter_Lt: + qb.AddCondition("max_slot", "<", filter.Lt) + case *UInt64Filter_Lte: + qb.AddCondition("max_slot", "<=", filter.Lte) + case *UInt64Filter_Gt: + qb.AddCondition("max_slot", ">", filter.Gt) + case *UInt64Filter_Gte: + qb.AddCondition("max_slot", ">=", filter.Gte) + case *UInt64Filter_Between: + qb.AddBetweenCondition("max_slot", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt64Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("max_slot", UInt64SliceToInterface(filter.In.Values)) + } + case *UInt64Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("max_slot", UInt64SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: day_count + if req.DayCount != nil { + switch filter := req.DayCount.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("day_count", "=", filter.Eq) + case *UInt32Filter_Ne: + qb.AddCondition("day_count", "!=", filter.Ne) + case *UInt32Filter_Lt: + qb.AddCondition("day_count", "<", filter.Lt) + case *UInt32Filter_Lte: + qb.AddCondition("day_count", "<=", filter.Lte) + case *UInt32Filter_Gt: + qb.AddCondition("day_count", ">", filter.Gt) + case *UInt32Filter_Gte: + qb.AddCondition("day_count", ">=", filter.Gte) + case *UInt32Filter_Between: + qb.AddBetweenCondition("day_count", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("day_count", UInt32SliceToInterface(filter.In.Values)) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("day_count", UInt32SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: epoch_count + if req.EpochCount != nil { + switch filter := req.EpochCount.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("epoch_count", "=", filter.Eq) + case *UInt32Filter_Ne: + qb.AddCondition("epoch_count", "!=", filter.Ne) + case *UInt32Filter_Lt: + qb.AddCondition("epoch_count", "<", filter.Lt) + case *UInt32Filter_Lte: + qb.AddCondition("epoch_count", "<=", filter.Lte) + case *UInt32Filter_Gt: + qb.AddCondition("epoch_count", ">", filter.Gt) + case *UInt32Filter_Gte: + qb.AddCondition("epoch_count", ">=", filter.Gte) + case *UInt32Filter_Between: + qb.AddBetweenCondition("epoch_count", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("epoch_count", UInt32SliceToInterface(filter.In.Values)) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("epoch_count", UInt32SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: slot_count + if req.SlotCount != nil { + switch filter := req.SlotCount.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("slot_count", "=", filter.Eq) + case *UInt32Filter_Ne: + qb.AddCondition("slot_count", "!=", filter.Ne) + case *UInt32Filter_Lt: + qb.AddCondition("slot_count", "<", filter.Lt) + case *UInt32Filter_Lte: + qb.AddCondition("slot_count", "<=", filter.Lte) + case *UInt32Filter_Gt: + qb.AddCondition("slot_count", ">", filter.Gt) + case *UInt32Filter_Gte: + qb.AddCondition("slot_count", ">=", filter.Gte) + case *UInt32Filter_Between: + qb.AddBetweenCondition("slot_count", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("slot_count", UInt32SliceToInterface(filter.In.Values)) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("slot_count", UInt32SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: min_seen_slot_start_diff_ms + if req.MinSeenSlotStartDiffMs != nil { + switch filter := req.MinSeenSlotStartDiffMs.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("min_seen_slot_start_diff_ms", "=", filter.Eq) + case *UInt32Filter_Ne: + qb.AddCondition("min_seen_slot_start_diff_ms", "!=", filter.Ne) + case *UInt32Filter_Lt: + qb.AddCondition("min_seen_slot_start_diff_ms", "<", filter.Lt) + case *UInt32Filter_Lte: + qb.AddCondition("min_seen_slot_start_diff_ms", "<=", filter.Lte) + case *UInt32Filter_Gt: + qb.AddCondition("min_seen_slot_start_diff_ms", ">", filter.Gt) + case *UInt32Filter_Gte: + qb.AddCondition("min_seen_slot_start_diff_ms", ">=", filter.Gte) + case *UInt32Filter_Between: + qb.AddBetweenCondition("min_seen_slot_start_diff_ms", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("min_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.In.Values)) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("min_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: p05_seen_slot_start_diff_ms + if req.P05SeenSlotStartDiffMs != nil { + switch filter := req.P05SeenSlotStartDiffMs.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("p05_seen_slot_start_diff_ms", "=", filter.Eq) + case *UInt32Filter_Ne: + qb.AddCondition("p05_seen_slot_start_diff_ms", "!=", filter.Ne) + case *UInt32Filter_Lt: + qb.AddCondition("p05_seen_slot_start_diff_ms", "<", filter.Lt) + case *UInt32Filter_Lte: + qb.AddCondition("p05_seen_slot_start_diff_ms", "<=", filter.Lte) + case *UInt32Filter_Gt: + qb.AddCondition("p05_seen_slot_start_diff_ms", ">", filter.Gt) + case *UInt32Filter_Gte: + qb.AddCondition("p05_seen_slot_start_diff_ms", ">=", filter.Gte) + case *UInt32Filter_Between: + qb.AddBetweenCondition("p05_seen_slot_start_diff_ms", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("p05_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.In.Values)) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("p05_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: p50_seen_slot_start_diff_ms + if req.P50SeenSlotStartDiffMs != nil { + switch filter := req.P50SeenSlotStartDiffMs.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("p50_seen_slot_start_diff_ms", "=", filter.Eq) + case *UInt32Filter_Ne: + qb.AddCondition("p50_seen_slot_start_diff_ms", "!=", filter.Ne) + case *UInt32Filter_Lt: + qb.AddCondition("p50_seen_slot_start_diff_ms", "<", filter.Lt) + case *UInt32Filter_Lte: + qb.AddCondition("p50_seen_slot_start_diff_ms", "<=", filter.Lte) + case *UInt32Filter_Gt: + qb.AddCondition("p50_seen_slot_start_diff_ms", ">", filter.Gt) + case *UInt32Filter_Gte: + qb.AddCondition("p50_seen_slot_start_diff_ms", ">=", filter.Gte) + case *UInt32Filter_Between: + qb.AddBetweenCondition("p50_seen_slot_start_diff_ms", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("p50_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.In.Values)) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("p50_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: avg_seen_slot_start_diff_ms + if req.AvgSeenSlotStartDiffMs != nil { + switch filter := req.AvgSeenSlotStartDiffMs.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("avg_seen_slot_start_diff_ms", "=", filter.Eq) + case *UInt32Filter_Ne: + qb.AddCondition("avg_seen_slot_start_diff_ms", "!=", filter.Ne) + case *UInt32Filter_Lt: + qb.AddCondition("avg_seen_slot_start_diff_ms", "<", filter.Lt) + case *UInt32Filter_Lte: + qb.AddCondition("avg_seen_slot_start_diff_ms", "<=", filter.Lte) + case *UInt32Filter_Gt: + qb.AddCondition("avg_seen_slot_start_diff_ms", ">", filter.Gt) + case *UInt32Filter_Gte: + qb.AddCondition("avg_seen_slot_start_diff_ms", ">=", filter.Gte) + case *UInt32Filter_Between: + qb.AddBetweenCondition("avg_seen_slot_start_diff_ms", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("avg_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.In.Values)) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("avg_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: p90_seen_slot_start_diff_ms + if req.P90SeenSlotStartDiffMs != nil { + switch filter := req.P90SeenSlotStartDiffMs.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("p90_seen_slot_start_diff_ms", "=", filter.Eq) + case *UInt32Filter_Ne: + qb.AddCondition("p90_seen_slot_start_diff_ms", "!=", filter.Ne) + case *UInt32Filter_Lt: + qb.AddCondition("p90_seen_slot_start_diff_ms", "<", filter.Lt) + case *UInt32Filter_Lte: + qb.AddCondition("p90_seen_slot_start_diff_ms", "<=", filter.Lte) + case *UInt32Filter_Gt: + qb.AddCondition("p90_seen_slot_start_diff_ms", ">", filter.Gt) + case *UInt32Filter_Gte: + qb.AddCondition("p90_seen_slot_start_diff_ms", ">=", filter.Gte) + case *UInt32Filter_Between: + qb.AddBetweenCondition("p90_seen_slot_start_diff_ms", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("p90_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.In.Values)) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("p90_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: p95_seen_slot_start_diff_ms + if req.P95SeenSlotStartDiffMs != nil { + switch filter := req.P95SeenSlotStartDiffMs.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("p95_seen_slot_start_diff_ms", "=", filter.Eq) + case *UInt32Filter_Ne: + qb.AddCondition("p95_seen_slot_start_diff_ms", "!=", filter.Ne) + case *UInt32Filter_Lt: + qb.AddCondition("p95_seen_slot_start_diff_ms", "<", filter.Lt) + case *UInt32Filter_Lte: + qb.AddCondition("p95_seen_slot_start_diff_ms", "<=", filter.Lte) + case *UInt32Filter_Gt: + qb.AddCondition("p95_seen_slot_start_diff_ms", ">", filter.Gt) + case *UInt32Filter_Gte: + qb.AddCondition("p95_seen_slot_start_diff_ms", ">=", filter.Gte) + case *UInt32Filter_Between: + qb.AddBetweenCondition("p95_seen_slot_start_diff_ms", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("p95_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.In.Values)) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("p95_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: p99_seen_slot_start_diff_ms + if req.P99SeenSlotStartDiffMs != nil { + switch filter := req.P99SeenSlotStartDiffMs.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("p99_seen_slot_start_diff_ms", "=", filter.Eq) + case *UInt32Filter_Ne: + qb.AddCondition("p99_seen_slot_start_diff_ms", "!=", filter.Ne) + case *UInt32Filter_Lt: + qb.AddCondition("p99_seen_slot_start_diff_ms", "<", filter.Lt) + case *UInt32Filter_Lte: + qb.AddCondition("p99_seen_slot_start_diff_ms", "<=", filter.Lte) + case *UInt32Filter_Gt: + qb.AddCondition("p99_seen_slot_start_diff_ms", ">", filter.Gt) + case *UInt32Filter_Gte: + qb.AddCondition("p99_seen_slot_start_diff_ms", ">=", filter.Gte) + case *UInt32Filter_Between: + qb.AddBetweenCondition("p99_seen_slot_start_diff_ms", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("p99_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.In.Values)) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("p99_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Add filter for column: max_seen_slot_start_diff_ms + if req.MaxSeenSlotStartDiffMs != nil { + switch filter := req.MaxSeenSlotStartDiffMs.Filter.(type) { + case *UInt32Filter_Eq: + qb.AddCondition("max_seen_slot_start_diff_ms", "=", filter.Eq) + case *UInt32Filter_Ne: + qb.AddCondition("max_seen_slot_start_diff_ms", "!=", filter.Ne) + case *UInt32Filter_Lt: + qb.AddCondition("max_seen_slot_start_diff_ms", "<", filter.Lt) + case *UInt32Filter_Lte: + qb.AddCondition("max_seen_slot_start_diff_ms", "<=", filter.Lte) + case *UInt32Filter_Gt: + qb.AddCondition("max_seen_slot_start_diff_ms", ">", filter.Gt) + case *UInt32Filter_Gte: + qb.AddCondition("max_seen_slot_start_diff_ms", ">=", filter.Gte) + case *UInt32Filter_Between: + qb.AddBetweenCondition("max_seen_slot_start_diff_ms", filter.Between.Min, filter.Between.Max.GetValue()) + case *UInt32Filter_In: + if len(filter.In.Values) > 0 { + qb.AddInCondition("max_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.In.Values)) + } + case *UInt32Filter_NotIn: + if len(filter.NotIn.Values) > 0 { + qb.AddNotInCondition("max_seen_slot_start_diff_ms", UInt32SliceToInterface(filter.NotIn.Values)) + } + default: + // Unsupported filter type + } + } + + // Handle pagination per AIP-132 + // Validate page size + if req.PageSize < 0 { + return SQLQuery{}, fmt.Errorf("page_size must be non-negative, got %d", req.PageSize) + } + if req.PageSize > 10000 { + return SQLQuery{}, fmt.Errorf("page_size must not exceed %d, got %d", 10000, req.PageSize) + } + + var limit, offset uint32 + limit = 100 // Default page size + if req.PageSize > 0 { + limit = uint32(req.PageSize) + } + if req.PageToken != "" { + decodedOffset, err := DecodePageToken(req.PageToken) + if err != nil { + return SQLQuery{}, fmt.Errorf("invalid page_token: %w", err) + } + offset = decodedOffset + } + + // Handle custom ordering if provided + var orderByClause string + if req.OrderBy != "" { + validFields := []string{"updated_date_time", "week", "week_start_date_time", "username", "node_id", "classification", "meta_client_name", "meta_client_implementation", "meta_client_geo_city", "meta_client_geo_country", "meta_client_geo_country_code", "meta_client_geo_continent_code", "meta_client_geo_longitude", "meta_client_geo_latitude", "meta_client_geo_autonomous_system_number", "meta_client_geo_autonomous_system_organization", "min_slot", "max_slot", "day_count", "epoch_count", "slot_count", "min_seen_slot_start_diff_ms", "p05_seen_slot_start_diff_ms", "p50_seen_slot_start_diff_ms", "avg_seen_slot_start_diff_ms", "p90_seen_slot_start_diff_ms", "p95_seen_slot_start_diff_ms", "p99_seen_slot_start_diff_ms", "max_seen_slot_start_diff_ms"} + orderFields, err := ParseOrderBy(req.OrderBy, validFields) + if err != nil { + return SQLQuery{}, fmt.Errorf("invalid order_by: %w", err) + } + orderByClause = BuildOrderByClause(orderFields) + } else { + // Default sorting by primary key + orderByClause = " ORDER BY week" + ", meta_client_name" + } + + // Build column list + columns := []string{"toUnixTimestamp(`updated_date_time`) AS `updated_date_time`", "toString(`week`) AS `week`", "toUnixTimestamp(`week_start_date_time`) AS `week_start_date_time`", "username", "node_id", "classification", "meta_client_name", "meta_client_implementation", "meta_client_geo_city", "meta_client_geo_country", "meta_client_geo_country_code", "meta_client_geo_continent_code", "meta_client_geo_longitude", "meta_client_geo_latitude", "meta_client_geo_autonomous_system_number", "meta_client_geo_autonomous_system_organization", "min_slot", "max_slot", "day_count", "epoch_count", "slot_count", "min_seen_slot_start_diff_ms", "p05_seen_slot_start_diff_ms", "p50_seen_slot_start_diff_ms", "avg_seen_slot_start_diff_ms", "p90_seen_slot_start_diff_ms", "p95_seen_slot_start_diff_ms", "p99_seen_slot_start_diff_ms", "max_seen_slot_start_diff_ms"} + + return BuildParameterizedQuery("fct_block_first_seen_by_node_weekly", columns, qb, orderByClause, limit, offset, options...) +} + +// BuildGetFctBlockFirstSeenByNodeWeeklyQuery constructs a parameterized SQL query from a GetFctBlockFirstSeenByNodeWeeklyRequest +func BuildGetFctBlockFirstSeenByNodeWeeklyQuery(req *GetFctBlockFirstSeenByNodeWeeklyRequest, options ...QueryOption) (SQLQuery, error) { + // Validate primary key is provided + if req.Week == "" { + return SQLQuery{}, fmt.Errorf("primary key field week is required") + } + + // Build query with primary key condition + qb := NewQueryBuilder() + qb.AddCondition("week", "=", req.Week) + + // Build ORDER BY clause + orderByClause := " ORDER BY week, meta_client_name" + + // Build column list + columns := []string{"toUnixTimestamp(`updated_date_time`) AS `updated_date_time`", "toString(`week`) AS `week`", "toUnixTimestamp(`week_start_date_time`) AS `week_start_date_time`", "username", "node_id", "classification", "meta_client_name", "meta_client_implementation", "meta_client_geo_city", "meta_client_geo_country", "meta_client_geo_country_code", "meta_client_geo_continent_code", "meta_client_geo_longitude", "meta_client_geo_latitude", "meta_client_geo_autonomous_system_number", "meta_client_geo_autonomous_system_organization", "min_slot", "max_slot", "day_count", "epoch_count", "slot_count", "min_seen_slot_start_diff_ms", "p05_seen_slot_start_diff_ms", "p50_seen_slot_start_diff_ms", "avg_seen_slot_start_diff_ms", "p90_seen_slot_start_diff_ms", "p95_seen_slot_start_diff_ms", "p99_seen_slot_start_diff_ms", "max_seen_slot_start_diff_ms"} + + // Return single record + return BuildParameterizedQuery("fct_block_first_seen_by_node_weekly", columns, qb, orderByClause, 1, 0, options...) +} diff --git a/pkg/proto/clickhouse/fct_block_first_seen_by_node_weekly.pb.go b/pkg/proto/clickhouse/fct_block_first_seen_by_node_weekly.pb.go new file mode 100644 index 00000000..cd1f30a9 --- /dev/null +++ b/pkg/proto/clickhouse/fct_block_first_seen_by_node_weekly.pb.go @@ -0,0 +1,1293 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.34.2 +// protoc (unknown) +// source: fct_block_first_seen_by_node_weekly.proto + +package clickhouse + +import ( + _ "github.com/ethpandaops/xatu-cbt/pkg/proto/clickhouse/clickhouse" + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + wrapperspb "google.golang.org/protobuf/types/known/wrapperspb" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type FctBlockFirstSeenByNodeWeekly struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Timestamp when the record was last updated + UpdatedDateTime uint32 `protobuf:"varint,11,opt,name=updated_date_time,json=updatedDateTime,proto3" json:"updated_date_time,omitempty"` + // Start of week (Monday) + Week string `protobuf:"bytes,12,opt,name=week,proto3" json:"week,omitempty"` + // Start of week at midnight UTC (Monday) + WeekStartDateTime uint32 `protobuf:"varint,13,opt,name=week_start_date_time,json=weekStartDateTime,proto3" json:"week_start_date_time,omitempty"` + // Username of the node + Username string `protobuf:"bytes,14,opt,name=username,proto3" json:"username,omitempty"` + // ID of the node + NodeId string `protobuf:"bytes,15,opt,name=node_id,json=nodeId,proto3" json:"node_id,omitempty"` + // Classification of the node, e.g. "individual", "corporate", "internal" (aka ethPandaOps) or "unclassified" + Classification string `protobuf:"bytes,16,opt,name=classification,proto3" json:"classification,omitempty"` + // Name of the client + MetaClientName string `protobuf:"bytes,17,opt,name=meta_client_name,json=metaClientName,proto3" json:"meta_client_name,omitempty"` + // Implementation of the client + MetaClientImplementation string `protobuf:"bytes,18,opt,name=meta_client_implementation,json=metaClientImplementation,proto3" json:"meta_client_implementation,omitempty"` + // City of the client + MetaClientGeoCity string `protobuf:"bytes,19,opt,name=meta_client_geo_city,json=metaClientGeoCity,proto3" json:"meta_client_geo_city,omitempty"` + // Country of the client + MetaClientGeoCountry string `protobuf:"bytes,20,opt,name=meta_client_geo_country,json=metaClientGeoCountry,proto3" json:"meta_client_geo_country,omitempty"` + // Country code of the client + MetaClientGeoCountryCode string `protobuf:"bytes,21,opt,name=meta_client_geo_country_code,json=metaClientGeoCountryCode,proto3" json:"meta_client_geo_country_code,omitempty"` + // Continent code of the client + MetaClientGeoContinentCode string `protobuf:"bytes,22,opt,name=meta_client_geo_continent_code,json=metaClientGeoContinentCode,proto3" json:"meta_client_geo_continent_code,omitempty"` + // Longitude of the client + MetaClientGeoLongitude *wrapperspb.DoubleValue `protobuf:"bytes,23,opt,name=meta_client_geo_longitude,json=metaClientGeoLongitude,proto3" json:"meta_client_geo_longitude,omitempty"` + // Latitude of the client + MetaClientGeoLatitude *wrapperspb.DoubleValue `protobuf:"bytes,24,opt,name=meta_client_geo_latitude,json=metaClientGeoLatitude,proto3" json:"meta_client_geo_latitude,omitempty"` + // Autonomous system number of the client + MetaClientGeoAutonomousSystemNumber *wrapperspb.UInt32Value `protobuf:"bytes,25,opt,name=meta_client_geo_autonomous_system_number,json=metaClientGeoAutonomousSystemNumber,proto3" json:"meta_client_geo_autonomous_system_number,omitempty"` + // Autonomous system organization of the client + MetaClientGeoAutonomousSystemOrganization *wrapperspb.StringValue `protobuf:"bytes,26,opt,name=meta_client_geo_autonomous_system_organization,json=metaClientGeoAutonomousSystemOrganization,proto3" json:"meta_client_geo_autonomous_system_organization,omitempty"` + // Minimum slot number in this week + MinSlot uint64 `protobuf:"varint,27,opt,name=min_slot,json=minSlot,proto3" json:"min_slot,omitempty"` + // Maximum slot number in this week + MaxSlot uint64 `protobuf:"varint,28,opt,name=max_slot,json=maxSlot,proto3" json:"max_slot,omitempty"` + // Number of days in this week + DayCount uint32 `protobuf:"varint,29,opt,name=day_count,json=dayCount,proto3" json:"day_count,omitempty"` + // Number of epochs in this week + EpochCount uint32 `protobuf:"varint,30,opt,name=epoch_count,json=epochCount,proto3" json:"epoch_count,omitempty"` + // Number of slots with blocks seen in this week + SlotCount uint32 `protobuf:"varint,31,opt,name=slot_count,json=slotCount,proto3" json:"slot_count,omitempty"` + // Minimum time from slot start for the node to see a block (milliseconds) + MinSeenSlotStartDiffMs uint32 `protobuf:"varint,32,opt,name=min_seen_slot_start_diff_ms,json=minSeenSlotStartDiffMs,proto3" json:"min_seen_slot_start_diff_ms,omitempty"` + // 5th percentile time from slot start (milliseconds) + P05SeenSlotStartDiffMs uint32 `protobuf:"varint,33,opt,name=p05_seen_slot_start_diff_ms,json=p05SeenSlotStartDiffMs,proto3" json:"p05_seen_slot_start_diff_ms,omitempty"` + // Median (p50) time from slot start (milliseconds) + P50SeenSlotStartDiffMs uint32 `protobuf:"varint,34,opt,name=p50_seen_slot_start_diff_ms,json=p50SeenSlotStartDiffMs,proto3" json:"p50_seen_slot_start_diff_ms,omitempty"` + // Average time from slot start (milliseconds) + AvgSeenSlotStartDiffMs uint32 `protobuf:"varint,35,opt,name=avg_seen_slot_start_diff_ms,json=avgSeenSlotStartDiffMs,proto3" json:"avg_seen_slot_start_diff_ms,omitempty"` + // 90th percentile time from slot start (milliseconds) + P90SeenSlotStartDiffMs uint32 `protobuf:"varint,36,opt,name=p90_seen_slot_start_diff_ms,json=p90SeenSlotStartDiffMs,proto3" json:"p90_seen_slot_start_diff_ms,omitempty"` + // 95th percentile time from slot start (milliseconds) + P95SeenSlotStartDiffMs uint32 `protobuf:"varint,37,opt,name=p95_seen_slot_start_diff_ms,json=p95SeenSlotStartDiffMs,proto3" json:"p95_seen_slot_start_diff_ms,omitempty"` + // 99th percentile time from slot start (milliseconds) + P99SeenSlotStartDiffMs uint32 `protobuf:"varint,38,opt,name=p99_seen_slot_start_diff_ms,json=p99SeenSlotStartDiffMs,proto3" json:"p99_seen_slot_start_diff_ms,omitempty"` + // Maximum time from slot start (milliseconds) + MaxSeenSlotStartDiffMs uint32 `protobuf:"varint,39,opt,name=max_seen_slot_start_diff_ms,json=maxSeenSlotStartDiffMs,proto3" json:"max_seen_slot_start_diff_ms,omitempty"` +} + +func (x *FctBlockFirstSeenByNodeWeekly) Reset() { + *x = FctBlockFirstSeenByNodeWeekly{} + if protoimpl.UnsafeEnabled { + mi := &file_fct_block_first_seen_by_node_weekly_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FctBlockFirstSeenByNodeWeekly) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FctBlockFirstSeenByNodeWeekly) ProtoMessage() {} + +func (x *FctBlockFirstSeenByNodeWeekly) ProtoReflect() protoreflect.Message { + mi := &file_fct_block_first_seen_by_node_weekly_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FctBlockFirstSeenByNodeWeekly.ProtoReflect.Descriptor instead. +func (*FctBlockFirstSeenByNodeWeekly) Descriptor() ([]byte, []int) { + return file_fct_block_first_seen_by_node_weekly_proto_rawDescGZIP(), []int{0} +} + +func (x *FctBlockFirstSeenByNodeWeekly) GetUpdatedDateTime() uint32 { + if x != nil { + return x.UpdatedDateTime + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeWeekly) GetWeek() string { + if x != nil { + return x.Week + } + return "" +} + +func (x *FctBlockFirstSeenByNodeWeekly) GetWeekStartDateTime() uint32 { + if x != nil { + return x.WeekStartDateTime + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeWeekly) GetUsername() string { + if x != nil { + return x.Username + } + return "" +} + +func (x *FctBlockFirstSeenByNodeWeekly) GetNodeId() string { + if x != nil { + return x.NodeId + } + return "" +} + +func (x *FctBlockFirstSeenByNodeWeekly) GetClassification() string { + if x != nil { + return x.Classification + } + return "" +} + +func (x *FctBlockFirstSeenByNodeWeekly) GetMetaClientName() string { + if x != nil { + return x.MetaClientName + } + return "" +} + +func (x *FctBlockFirstSeenByNodeWeekly) GetMetaClientImplementation() string { + if x != nil { + return x.MetaClientImplementation + } + return "" +} + +func (x *FctBlockFirstSeenByNodeWeekly) GetMetaClientGeoCity() string { + if x != nil { + return x.MetaClientGeoCity + } + return "" +} + +func (x *FctBlockFirstSeenByNodeWeekly) GetMetaClientGeoCountry() string { + if x != nil { + return x.MetaClientGeoCountry + } + return "" +} + +func (x *FctBlockFirstSeenByNodeWeekly) GetMetaClientGeoCountryCode() string { + if x != nil { + return x.MetaClientGeoCountryCode + } + return "" +} + +func (x *FctBlockFirstSeenByNodeWeekly) GetMetaClientGeoContinentCode() string { + if x != nil { + return x.MetaClientGeoContinentCode + } + return "" +} + +func (x *FctBlockFirstSeenByNodeWeekly) GetMetaClientGeoLongitude() *wrapperspb.DoubleValue { + if x != nil { + return x.MetaClientGeoLongitude + } + return nil +} + +func (x *FctBlockFirstSeenByNodeWeekly) GetMetaClientGeoLatitude() *wrapperspb.DoubleValue { + if x != nil { + return x.MetaClientGeoLatitude + } + return nil +} + +func (x *FctBlockFirstSeenByNodeWeekly) GetMetaClientGeoAutonomousSystemNumber() *wrapperspb.UInt32Value { + if x != nil { + return x.MetaClientGeoAutonomousSystemNumber + } + return nil +} + +func (x *FctBlockFirstSeenByNodeWeekly) GetMetaClientGeoAutonomousSystemOrganization() *wrapperspb.StringValue { + if x != nil { + return x.MetaClientGeoAutonomousSystemOrganization + } + return nil +} + +func (x *FctBlockFirstSeenByNodeWeekly) GetMinSlot() uint64 { + if x != nil { + return x.MinSlot + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeWeekly) GetMaxSlot() uint64 { + if x != nil { + return x.MaxSlot + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeWeekly) GetDayCount() uint32 { + if x != nil { + return x.DayCount + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeWeekly) GetEpochCount() uint32 { + if x != nil { + return x.EpochCount + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeWeekly) GetSlotCount() uint32 { + if x != nil { + return x.SlotCount + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeWeekly) GetMinSeenSlotStartDiffMs() uint32 { + if x != nil { + return x.MinSeenSlotStartDiffMs + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeWeekly) GetP05SeenSlotStartDiffMs() uint32 { + if x != nil { + return x.P05SeenSlotStartDiffMs + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeWeekly) GetP50SeenSlotStartDiffMs() uint32 { + if x != nil { + return x.P50SeenSlotStartDiffMs + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeWeekly) GetAvgSeenSlotStartDiffMs() uint32 { + if x != nil { + return x.AvgSeenSlotStartDiffMs + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeWeekly) GetP90SeenSlotStartDiffMs() uint32 { + if x != nil { + return x.P90SeenSlotStartDiffMs + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeWeekly) GetP95SeenSlotStartDiffMs() uint32 { + if x != nil { + return x.P95SeenSlotStartDiffMs + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeWeekly) GetP99SeenSlotStartDiffMs() uint32 { + if x != nil { + return x.P99SeenSlotStartDiffMs + } + return 0 +} + +func (x *FctBlockFirstSeenByNodeWeekly) GetMaxSeenSlotStartDiffMs() uint32 { + if x != nil { + return x.MaxSeenSlotStartDiffMs + } + return 0 +} + +// Request for listing fct_block_first_seen_by_node_weekly records +type ListFctBlockFirstSeenByNodeWeeklyRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Filter by week - Start of week (Monday) (PRIMARY KEY - required) + Week *StringFilter `protobuf:"bytes,1,opt,name=week,proto3" json:"week,omitempty"` + // Filter by meta_client_name - Name of the client (ORDER BY column 2 - optional) + MetaClientName *StringFilter `protobuf:"bytes,2,opt,name=meta_client_name,json=metaClientName,proto3" json:"meta_client_name,omitempty"` + // Filter by updated_date_time - Timestamp when the record was last updated (optional) + UpdatedDateTime *UInt32Filter `protobuf:"bytes,3,opt,name=updated_date_time,json=updatedDateTime,proto3" json:"updated_date_time,omitempty"` + // Filter by week_start_date_time - Start of week at midnight UTC (Monday) (optional) + WeekStartDateTime *UInt32Filter `protobuf:"bytes,4,opt,name=week_start_date_time,json=weekStartDateTime,proto3" json:"week_start_date_time,omitempty"` + // Filter by username - Username of the node (optional) + Username *StringFilter `protobuf:"bytes,5,opt,name=username,proto3" json:"username,omitempty"` + // Filter by node_id - ID of the node (optional) + NodeId *StringFilter `protobuf:"bytes,6,opt,name=node_id,json=nodeId,proto3" json:"node_id,omitempty"` + // Filter by classification - Classification of the node, e.g. "individual", "corporate", "internal" (aka ethPandaOps) or "unclassified" (optional) + Classification *StringFilter `protobuf:"bytes,7,opt,name=classification,proto3" json:"classification,omitempty"` + // Filter by meta_client_implementation - Implementation of the client (optional) + MetaClientImplementation *StringFilter `protobuf:"bytes,8,opt,name=meta_client_implementation,json=metaClientImplementation,proto3" json:"meta_client_implementation,omitempty"` + // Filter by meta_client_geo_city - City of the client (optional) + MetaClientGeoCity *StringFilter `protobuf:"bytes,9,opt,name=meta_client_geo_city,json=metaClientGeoCity,proto3" json:"meta_client_geo_city,omitempty"` + // Filter by meta_client_geo_country - Country of the client (optional) + MetaClientGeoCountry *StringFilter `protobuf:"bytes,10,opt,name=meta_client_geo_country,json=metaClientGeoCountry,proto3" json:"meta_client_geo_country,omitempty"` + // Filter by meta_client_geo_country_code - Country code of the client (optional) + MetaClientGeoCountryCode *StringFilter `protobuf:"bytes,11,opt,name=meta_client_geo_country_code,json=metaClientGeoCountryCode,proto3" json:"meta_client_geo_country_code,omitempty"` + // Filter by meta_client_geo_continent_code - Continent code of the client (optional) + MetaClientGeoContinentCode *StringFilter `protobuf:"bytes,12,opt,name=meta_client_geo_continent_code,json=metaClientGeoContinentCode,proto3" json:"meta_client_geo_continent_code,omitempty"` + // Filter by meta_client_geo_longitude - Longitude of the client (optional) + MetaClientGeoLongitude *wrapperspb.DoubleValue `protobuf:"bytes,13,opt,name=meta_client_geo_longitude,json=metaClientGeoLongitude,proto3" json:"meta_client_geo_longitude,omitempty"` + // Filter by meta_client_geo_latitude - Latitude of the client (optional) + MetaClientGeoLatitude *wrapperspb.DoubleValue `protobuf:"bytes,14,opt,name=meta_client_geo_latitude,json=metaClientGeoLatitude,proto3" json:"meta_client_geo_latitude,omitempty"` + // Filter by meta_client_geo_autonomous_system_number - Autonomous system number of the client (optional) + MetaClientGeoAutonomousSystemNumber *NullableUInt32Filter `protobuf:"bytes,15,opt,name=meta_client_geo_autonomous_system_number,json=metaClientGeoAutonomousSystemNumber,proto3" json:"meta_client_geo_autonomous_system_number,omitempty"` + // Filter by meta_client_geo_autonomous_system_organization - Autonomous system organization of the client (optional) + MetaClientGeoAutonomousSystemOrganization *NullableStringFilter `protobuf:"bytes,16,opt,name=meta_client_geo_autonomous_system_organization,json=metaClientGeoAutonomousSystemOrganization,proto3" json:"meta_client_geo_autonomous_system_organization,omitempty"` + // Filter by min_slot - Minimum slot number in this week (optional) + MinSlot *UInt64Filter `protobuf:"bytes,17,opt,name=min_slot,json=minSlot,proto3" json:"min_slot,omitempty"` + // Filter by max_slot - Maximum slot number in this week (optional) + MaxSlot *UInt64Filter `protobuf:"bytes,18,opt,name=max_slot,json=maxSlot,proto3" json:"max_slot,omitempty"` + // Filter by day_count - Number of days in this week (optional) + DayCount *UInt32Filter `protobuf:"bytes,19,opt,name=day_count,json=dayCount,proto3" json:"day_count,omitempty"` + // Filter by epoch_count - Number of epochs in this week (optional) + EpochCount *UInt32Filter `protobuf:"bytes,20,opt,name=epoch_count,json=epochCount,proto3" json:"epoch_count,omitempty"` + // Filter by slot_count - Number of slots with blocks seen in this week (optional) + SlotCount *UInt32Filter `protobuf:"bytes,21,opt,name=slot_count,json=slotCount,proto3" json:"slot_count,omitempty"` + // Filter by min_seen_slot_start_diff_ms - Minimum time from slot start for the node to see a block (milliseconds) (optional) + MinSeenSlotStartDiffMs *UInt32Filter `protobuf:"bytes,22,opt,name=min_seen_slot_start_diff_ms,json=minSeenSlotStartDiffMs,proto3" json:"min_seen_slot_start_diff_ms,omitempty"` + // Filter by p05_seen_slot_start_diff_ms - 5th percentile time from slot start (milliseconds) (optional) + P05SeenSlotStartDiffMs *UInt32Filter `protobuf:"bytes,23,opt,name=p05_seen_slot_start_diff_ms,json=p05SeenSlotStartDiffMs,proto3" json:"p05_seen_slot_start_diff_ms,omitempty"` + // Filter by p50_seen_slot_start_diff_ms - Median (p50) time from slot start (milliseconds) (optional) + P50SeenSlotStartDiffMs *UInt32Filter `protobuf:"bytes,24,opt,name=p50_seen_slot_start_diff_ms,json=p50SeenSlotStartDiffMs,proto3" json:"p50_seen_slot_start_diff_ms,omitempty"` + // Filter by avg_seen_slot_start_diff_ms - Average time from slot start (milliseconds) (optional) + AvgSeenSlotStartDiffMs *UInt32Filter `protobuf:"bytes,25,opt,name=avg_seen_slot_start_diff_ms,json=avgSeenSlotStartDiffMs,proto3" json:"avg_seen_slot_start_diff_ms,omitempty"` + // Filter by p90_seen_slot_start_diff_ms - 90th percentile time from slot start (milliseconds) (optional) + P90SeenSlotStartDiffMs *UInt32Filter `protobuf:"bytes,26,opt,name=p90_seen_slot_start_diff_ms,json=p90SeenSlotStartDiffMs,proto3" json:"p90_seen_slot_start_diff_ms,omitempty"` + // Filter by p95_seen_slot_start_diff_ms - 95th percentile time from slot start (milliseconds) (optional) + P95SeenSlotStartDiffMs *UInt32Filter `protobuf:"bytes,27,opt,name=p95_seen_slot_start_diff_ms,json=p95SeenSlotStartDiffMs,proto3" json:"p95_seen_slot_start_diff_ms,omitempty"` + // Filter by p99_seen_slot_start_diff_ms - 99th percentile time from slot start (milliseconds) (optional) + P99SeenSlotStartDiffMs *UInt32Filter `protobuf:"bytes,28,opt,name=p99_seen_slot_start_diff_ms,json=p99SeenSlotStartDiffMs,proto3" json:"p99_seen_slot_start_diff_ms,omitempty"` + // Filter by max_seen_slot_start_diff_ms - Maximum time from slot start (milliseconds) (optional) + MaxSeenSlotStartDiffMs *UInt32Filter `protobuf:"bytes,29,opt,name=max_seen_slot_start_diff_ms,json=maxSeenSlotStartDiffMs,proto3" json:"max_seen_slot_start_diff_ms,omitempty"` + // The maximum number of fct_block_first_seen_by_node_weekly to return. + // If unspecified, at most 100 items will be returned. + // The maximum value is 10000; values above 10000 will be coerced to 10000. + PageSize int32 `protobuf:"varint,30,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + // A page token, received from a previous `ListFctBlockFirstSeenByNodeWeekly` call. + // Provide this to retrieve the subsequent page. + PageToken string `protobuf:"bytes,31,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + // The order of results. Format: comma-separated list of fields. + // Example: "foo,bar" or "foo desc,bar" for descending order on foo. + // If unspecified, results will be returned in the default order. + OrderBy string `protobuf:"bytes,32,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"` +} + +func (x *ListFctBlockFirstSeenByNodeWeeklyRequest) Reset() { + *x = ListFctBlockFirstSeenByNodeWeeklyRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_fct_block_first_seen_by_node_weekly_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListFctBlockFirstSeenByNodeWeeklyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListFctBlockFirstSeenByNodeWeeklyRequest) ProtoMessage() {} + +func (x *ListFctBlockFirstSeenByNodeWeeklyRequest) ProtoReflect() protoreflect.Message { + mi := &file_fct_block_first_seen_by_node_weekly_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListFctBlockFirstSeenByNodeWeeklyRequest.ProtoReflect.Descriptor instead. +func (*ListFctBlockFirstSeenByNodeWeeklyRequest) Descriptor() ([]byte, []int) { + return file_fct_block_first_seen_by_node_weekly_proto_rawDescGZIP(), []int{1} +} + +func (x *ListFctBlockFirstSeenByNodeWeeklyRequest) GetWeek() *StringFilter { + if x != nil { + return x.Week + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeWeeklyRequest) GetMetaClientName() *StringFilter { + if x != nil { + return x.MetaClientName + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeWeeklyRequest) GetUpdatedDateTime() *UInt32Filter { + if x != nil { + return x.UpdatedDateTime + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeWeeklyRequest) GetWeekStartDateTime() *UInt32Filter { + if x != nil { + return x.WeekStartDateTime + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeWeeklyRequest) GetUsername() *StringFilter { + if x != nil { + return x.Username + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeWeeklyRequest) GetNodeId() *StringFilter { + if x != nil { + return x.NodeId + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeWeeklyRequest) GetClassification() *StringFilter { + if x != nil { + return x.Classification + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeWeeklyRequest) GetMetaClientImplementation() *StringFilter { + if x != nil { + return x.MetaClientImplementation + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeWeeklyRequest) GetMetaClientGeoCity() *StringFilter { + if x != nil { + return x.MetaClientGeoCity + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeWeeklyRequest) GetMetaClientGeoCountry() *StringFilter { + if x != nil { + return x.MetaClientGeoCountry + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeWeeklyRequest) GetMetaClientGeoCountryCode() *StringFilter { + if x != nil { + return x.MetaClientGeoCountryCode + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeWeeklyRequest) GetMetaClientGeoContinentCode() *StringFilter { + if x != nil { + return x.MetaClientGeoContinentCode + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeWeeklyRequest) GetMetaClientGeoLongitude() *wrapperspb.DoubleValue { + if x != nil { + return x.MetaClientGeoLongitude + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeWeeklyRequest) GetMetaClientGeoLatitude() *wrapperspb.DoubleValue { + if x != nil { + return x.MetaClientGeoLatitude + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeWeeklyRequest) GetMetaClientGeoAutonomousSystemNumber() *NullableUInt32Filter { + if x != nil { + return x.MetaClientGeoAutonomousSystemNumber + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeWeeklyRequest) GetMetaClientGeoAutonomousSystemOrganization() *NullableStringFilter { + if x != nil { + return x.MetaClientGeoAutonomousSystemOrganization + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeWeeklyRequest) GetMinSlot() *UInt64Filter { + if x != nil { + return x.MinSlot + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeWeeklyRequest) GetMaxSlot() *UInt64Filter { + if x != nil { + return x.MaxSlot + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeWeeklyRequest) GetDayCount() *UInt32Filter { + if x != nil { + return x.DayCount + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeWeeklyRequest) GetEpochCount() *UInt32Filter { + if x != nil { + return x.EpochCount + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeWeeklyRequest) GetSlotCount() *UInt32Filter { + if x != nil { + return x.SlotCount + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeWeeklyRequest) GetMinSeenSlotStartDiffMs() *UInt32Filter { + if x != nil { + return x.MinSeenSlotStartDiffMs + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeWeeklyRequest) GetP05SeenSlotStartDiffMs() *UInt32Filter { + if x != nil { + return x.P05SeenSlotStartDiffMs + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeWeeklyRequest) GetP50SeenSlotStartDiffMs() *UInt32Filter { + if x != nil { + return x.P50SeenSlotStartDiffMs + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeWeeklyRequest) GetAvgSeenSlotStartDiffMs() *UInt32Filter { + if x != nil { + return x.AvgSeenSlotStartDiffMs + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeWeeklyRequest) GetP90SeenSlotStartDiffMs() *UInt32Filter { + if x != nil { + return x.P90SeenSlotStartDiffMs + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeWeeklyRequest) GetP95SeenSlotStartDiffMs() *UInt32Filter { + if x != nil { + return x.P95SeenSlotStartDiffMs + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeWeeklyRequest) GetP99SeenSlotStartDiffMs() *UInt32Filter { + if x != nil { + return x.P99SeenSlotStartDiffMs + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeWeeklyRequest) GetMaxSeenSlotStartDiffMs() *UInt32Filter { + if x != nil { + return x.MaxSeenSlotStartDiffMs + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeWeeklyRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListFctBlockFirstSeenByNodeWeeklyRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +func (x *ListFctBlockFirstSeenByNodeWeeklyRequest) GetOrderBy() string { + if x != nil { + return x.OrderBy + } + return "" +} + +// Response for listing fct_block_first_seen_by_node_weekly records +type ListFctBlockFirstSeenByNodeWeeklyResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The list of fct_block_first_seen_by_node_weekly. + FctBlockFirstSeenByNodeWeekly []*FctBlockFirstSeenByNodeWeekly `protobuf:"bytes,1,rep,name=fct_block_first_seen_by_node_weekly,json=fctBlockFirstSeenByNodeWeekly,proto3" json:"fct_block_first_seen_by_node_weekly,omitempty"` + // A token, which can be sent as `page_token` to retrieve the next page. + // If this field is omitted, there are no subsequent pages. + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` +} + +func (x *ListFctBlockFirstSeenByNodeWeeklyResponse) Reset() { + *x = ListFctBlockFirstSeenByNodeWeeklyResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_fct_block_first_seen_by_node_weekly_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListFctBlockFirstSeenByNodeWeeklyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListFctBlockFirstSeenByNodeWeeklyResponse) ProtoMessage() {} + +func (x *ListFctBlockFirstSeenByNodeWeeklyResponse) ProtoReflect() protoreflect.Message { + mi := &file_fct_block_first_seen_by_node_weekly_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListFctBlockFirstSeenByNodeWeeklyResponse.ProtoReflect.Descriptor instead. +func (*ListFctBlockFirstSeenByNodeWeeklyResponse) Descriptor() ([]byte, []int) { + return file_fct_block_first_seen_by_node_weekly_proto_rawDescGZIP(), []int{2} +} + +func (x *ListFctBlockFirstSeenByNodeWeeklyResponse) GetFctBlockFirstSeenByNodeWeekly() []*FctBlockFirstSeenByNodeWeekly { + if x != nil { + return x.FctBlockFirstSeenByNodeWeekly + } + return nil +} + +func (x *ListFctBlockFirstSeenByNodeWeeklyResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +// Request for getting a single fct_block_first_seen_by_node_weekly record by primary key +type GetFctBlockFirstSeenByNodeWeeklyRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Start of week (Monday) + Week string `protobuf:"bytes,1,opt,name=week,proto3" json:"week,omitempty"` // Primary key (required) +} + +func (x *GetFctBlockFirstSeenByNodeWeeklyRequest) Reset() { + *x = GetFctBlockFirstSeenByNodeWeeklyRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_fct_block_first_seen_by_node_weekly_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetFctBlockFirstSeenByNodeWeeklyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetFctBlockFirstSeenByNodeWeeklyRequest) ProtoMessage() {} + +func (x *GetFctBlockFirstSeenByNodeWeeklyRequest) ProtoReflect() protoreflect.Message { + mi := &file_fct_block_first_seen_by_node_weekly_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetFctBlockFirstSeenByNodeWeeklyRequest.ProtoReflect.Descriptor instead. +func (*GetFctBlockFirstSeenByNodeWeeklyRequest) Descriptor() ([]byte, []int) { + return file_fct_block_first_seen_by_node_weekly_proto_rawDescGZIP(), []int{3} +} + +func (x *GetFctBlockFirstSeenByNodeWeeklyRequest) GetWeek() string { + if x != nil { + return x.Week + } + return "" +} + +// Response for getting a single fct_block_first_seen_by_node_weekly record +type GetFctBlockFirstSeenByNodeWeeklyResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Item *FctBlockFirstSeenByNodeWeekly `protobuf:"bytes,1,opt,name=item,proto3" json:"item,omitempty"` +} + +func (x *GetFctBlockFirstSeenByNodeWeeklyResponse) Reset() { + *x = GetFctBlockFirstSeenByNodeWeeklyResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_fct_block_first_seen_by_node_weekly_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetFctBlockFirstSeenByNodeWeeklyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetFctBlockFirstSeenByNodeWeeklyResponse) ProtoMessage() {} + +func (x *GetFctBlockFirstSeenByNodeWeeklyResponse) ProtoReflect() protoreflect.Message { + mi := &file_fct_block_first_seen_by_node_weekly_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetFctBlockFirstSeenByNodeWeeklyResponse.ProtoReflect.Descriptor instead. +func (*GetFctBlockFirstSeenByNodeWeeklyResponse) Descriptor() ([]byte, []int) { + return file_fct_block_first_seen_by_node_weekly_proto_rawDescGZIP(), []int{4} +} + +func (x *GetFctBlockFirstSeenByNodeWeeklyResponse) GetItem() *FctBlockFirstSeenByNodeWeekly { + if x != nil { + return x.Item + } + return nil +} + +var File_fct_block_first_seen_by_node_weekly_proto protoreflect.FileDescriptor + +var file_fct_block_first_seen_by_node_weekly_proto_rawDesc = []byte{ + 0x0a, 0x29, 0x66, 0x63, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x66, 0x69, 0x72, 0x73, + 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x62, 0x79, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x77, + 0x65, 0x65, 0x6b, 0x6c, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x03, 0x63, 0x62, 0x74, + 0x1a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, + 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, + 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x63, + 0x6c, 0x69, 0x63, 0x6b, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xe2, 0x0c, 0x0a, 0x1d, + 0x46, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x72, 0x73, 0x74, 0x53, 0x65, 0x65, + 0x6e, 0x42, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x65, 0x65, 0x6b, 0x6c, 0x79, 0x12, 0x2a, 0x0a, + 0x11, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x44, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x77, 0x65, 0x65, + 0x6b, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x77, 0x65, 0x65, 0x6b, 0x12, 0x2f, 0x0a, + 0x14, 0x77, 0x65, 0x65, 0x6b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x65, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x77, 0x65, 0x65, + 0x6b, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, + 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, + 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x10, 0x6d, + 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3c, 0x0a, 0x1a, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x18, 0x6d, 0x65, 0x74, 0x61, 0x43, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x14, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x63, 0x69, 0x74, 0x79, 0x18, 0x13, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x11, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x47, 0x65, 0x6f, + 0x43, 0x69, 0x74, 0x79, 0x12, 0x35, 0x0a, 0x17, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, + 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x47, 0x65, 0x6f, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x3e, 0x0a, 0x1c, 0x6d, + 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x18, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x47, 0x65, 0x6f, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x42, 0x0a, 0x1e, 0x6d, + 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x16, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x1a, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x47, + 0x65, 0x6f, 0x43, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, + 0x57, 0x0a, 0x19, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x67, + 0x65, 0x6f, 0x5f, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x17, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x52, 0x16, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x47, 0x65, 0x6f, 0x4c, + 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x55, 0x0a, 0x18, 0x6d, 0x65, 0x74, 0x61, + 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x6c, 0x61, 0x74, 0x69, + 0x74, 0x75, 0x64, 0x65, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x6f, 0x75, + 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x15, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x47, 0x65, 0x6f, 0x4c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, + 0x73, 0x0a, 0x28, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x67, + 0x65, 0x6f, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x6e, 0x6f, 0x6d, 0x6f, 0x75, 0x73, 0x5f, 0x73, 0x79, + 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x19, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, + 0x23, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x47, 0x65, 0x6f, 0x41, 0x75, + 0x74, 0x6f, 0x6e, 0x6f, 0x6d, 0x6f, 0x75, 0x73, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x12, 0x7f, 0x0a, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x6e, 0x6f, 0x6d, 0x6f, + 0x75, 0x73, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x29, 0x6d, 0x65, 0x74, 0x61, + 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x47, 0x65, 0x6f, 0x41, 0x75, 0x74, 0x6f, 0x6e, 0x6f, 0x6d, + 0x6f, 0x75, 0x73, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x69, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, + 0x74, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x6d, 0x69, 0x6e, 0x53, 0x6c, 0x6f, 0x74, + 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x1c, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x53, 0x6c, 0x6f, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x64, + 0x61, 0x79, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, + 0x64, 0x61, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x70, 0x6f, 0x63, + 0x68, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x65, + 0x70, 0x6f, 0x63, 0x68, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x6c, 0x6f, + 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x73, + 0x6c, 0x6f, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3b, 0x0a, 0x1b, 0x6d, 0x69, 0x6e, 0x5f, + 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, + 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x20, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x16, 0x6d, + 0x69, 0x6e, 0x53, 0x65, 0x65, 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, + 0x69, 0x66, 0x66, 0x4d, 0x73, 0x12, 0x3b, 0x0a, 0x1b, 0x70, 0x30, 0x35, 0x5f, 0x73, 0x65, 0x65, + 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, + 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x21, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x16, 0x70, 0x30, 0x35, 0x53, + 0x65, 0x65, 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x69, 0x66, 0x66, + 0x4d, 0x73, 0x12, 0x3b, 0x0a, 0x1b, 0x70, 0x35, 0x30, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, + 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, + 0x73, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x16, 0x70, 0x35, 0x30, 0x53, 0x65, 0x65, 0x6e, + 0x53, 0x6c, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x69, 0x66, 0x66, 0x4d, 0x73, 0x12, + 0x3b, 0x0a, 0x1b, 0x61, 0x76, 0x67, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, + 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x23, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x16, 0x61, 0x76, 0x67, 0x53, 0x65, 0x65, 0x6e, 0x53, 0x6c, 0x6f, + 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x69, 0x66, 0x66, 0x4d, 0x73, 0x12, 0x3b, 0x0a, 0x1b, + 0x70, 0x39, 0x30, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x24, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x16, 0x70, 0x39, 0x30, 0x53, 0x65, 0x65, 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x44, 0x69, 0x66, 0x66, 0x4d, 0x73, 0x12, 0x3b, 0x0a, 0x1b, 0x70, 0x39, 0x35, + 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x25, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x16, + 0x70, 0x39, 0x35, 0x53, 0x65, 0x65, 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x44, 0x69, 0x66, 0x66, 0x4d, 0x73, 0x12, 0x3b, 0x0a, 0x1b, 0x70, 0x39, 0x39, 0x5f, 0x73, 0x65, + 0x65, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, + 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x26, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x16, 0x70, 0x39, 0x39, + 0x53, 0x65, 0x65, 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x69, 0x66, + 0x66, 0x4d, 0x73, 0x12, 0x3b, 0x0a, 0x1b, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, + 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, + 0x6d, 0x73, 0x18, 0x27, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x16, 0x6d, 0x61, 0x78, 0x53, 0x65, 0x65, + 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x69, 0x66, 0x66, 0x4d, 0x73, + 0x22, 0xc9, 0x12, 0x0a, 0x28, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x46, 0x69, 0x72, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x42, 0x79, 0x4e, 0x6f, 0x64, 0x65, + 0x57, 0x65, 0x65, 0x6b, 0x6c, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, + 0x04, 0x77, 0x65, 0x65, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, + 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x12, + 0xe0, 0x41, 0x02, 0x9a, 0xb5, 0x18, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x6b, + 0x65, 0x79, 0x52, 0x04, 0x77, 0x65, 0x65, 0x6b, 0x12, 0x40, 0x0a, 0x10, 0x6d, 0x65, 0x74, 0x61, + 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0e, 0x6d, 0x65, 0x74, 0x61, + 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x42, 0x0a, 0x11, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x55, 0x49, 0x6e, 0x74, + 0x33, 0x32, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0f, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x44, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x47, + 0x0a, 0x14, 0x77, 0x65, 0x65, 0x6b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x61, 0x74, + 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, + 0x62, 0x74, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, + 0x03, 0xe0, 0x41, 0x01, 0x52, 0x11, 0x77, 0x65, 0x65, 0x6b, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, + 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x32, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, + 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, + 0x01, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x07, 0x6e, + 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, + 0x62, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, + 0x03, 0xe0, 0x41, 0x01, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x0e, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0e, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x54, 0x0a, 0x1a, + 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6d, 0x70, 0x6c, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x18, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x47, 0x0a, 0x14, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x63, 0x69, 0x74, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x11, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x47, 0x65, 0x6f, 0x43, 0x69, 0x74, 0x79, 0x12, 0x4d, 0x0a, 0x17, 0x6d, + 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, + 0x62, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, + 0x03, 0xe0, 0x41, 0x01, 0x52, 0x14, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x47, 0x65, 0x6f, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x56, 0x0a, 0x1c, 0x6d, 0x65, + 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x18, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x47, 0x65, 0x6f, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, + 0x64, 0x65, 0x12, 0x5a, 0x0a, 0x1e, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x65, 0x6e, 0x74, 0x5f, + 0x63, 0x6f, 0x64, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, + 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, + 0x41, 0x01, 0x52, 0x1a, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x47, 0x65, + 0x6f, 0x43, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x5c, + 0x0a, 0x19, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x65, + 0x6f, 0x5f, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, + 0x03, 0xe0, 0x41, 0x01, 0x52, 0x16, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x47, 0x65, 0x6f, 0x4c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x5a, 0x0a, 0x18, + 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x65, 0x6f, 0x5f, + 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x03, 0xe0, 0x41, + 0x01, 0x52, 0x15, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x47, 0x65, 0x6f, + 0x4c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x75, 0x0a, 0x28, 0x6d, 0x65, 0x74, 0x61, + 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x65, 0x6f, 0x5f, 0x61, 0x75, 0x74, 0x6f, + 0x6e, 0x6f, 0x6d, 0x6f, 0x75, 0x73, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x62, 0x74, + 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x23, 0x6d, 0x65, 0x74, 0x61, + 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x47, 0x65, 0x6f, 0x41, 0x75, 0x74, 0x6f, 0x6e, 0x6f, 0x6d, + 0x6f, 0x75, 0x73, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, + 0x81, 0x01, 0x0a, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, + 0x67, 0x65, 0x6f, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x6e, 0x6f, 0x6d, 0x6f, 0x75, 0x73, 0x5f, 0x73, + 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x4e, + 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x29, 0x6d, 0x65, 0x74, 0x61, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x47, 0x65, 0x6f, 0x41, 0x75, 0x74, 0x6f, 0x6e, 0x6f, 0x6d, 0x6f, 0x75, + 0x73, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x0a, 0x08, 0x6d, 0x69, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x18, + 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x55, 0x49, 0x6e, 0x74, + 0x36, 0x34, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x07, 0x6d, + 0x69, 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x12, 0x31, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x6c, + 0x6f, 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x55, + 0x49, 0x6e, 0x74, 0x36, 0x34, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, + 0x52, 0x07, 0x6d, 0x61, 0x78, 0x53, 0x6c, 0x6f, 0x74, 0x12, 0x33, 0x0a, 0x09, 0x64, 0x61, 0x79, + 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, + 0x62, 0x74, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, + 0x03, 0xe0, 0x41, 0x01, 0x52, 0x08, 0x64, 0x61, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x37, + 0x0a, 0x0b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x14, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, + 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0a, 0x65, 0x70, 0x6f, + 0x63, 0x68, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x35, 0x0a, 0x0a, 0x73, 0x6c, 0x6f, 0x74, 0x5f, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, + 0x74, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, + 0xe0, 0x41, 0x01, 0x52, 0x09, 0x73, 0x6c, 0x6f, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x53, + 0x0a, 0x1b, 0x6d, 0x69, 0x6e, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x16, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, + 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x16, 0x6d, 0x69, 0x6e, + 0x53, 0x65, 0x65, 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x69, 0x66, + 0x66, 0x4d, 0x73, 0x12, 0x53, 0x0a, 0x1b, 0x70, 0x30, 0x35, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, + 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, + 0x6d, 0x73, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x55, + 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, + 0x52, 0x16, 0x70, 0x30, 0x35, 0x53, 0x65, 0x65, 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x44, 0x69, 0x66, 0x66, 0x4d, 0x73, 0x12, 0x53, 0x0a, 0x1b, 0x70, 0x35, 0x30, 0x5f, + 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, + 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, + 0x63, 0x62, 0x74, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x16, 0x70, 0x35, 0x30, 0x53, 0x65, 0x65, 0x6e, 0x53, 0x6c, + 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x69, 0x66, 0x66, 0x4d, 0x73, 0x12, 0x53, 0x0a, + 0x1b, 0x61, 0x76, 0x67, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x19, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x16, 0x61, 0x76, 0x67, 0x53, + 0x65, 0x65, 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x69, 0x66, 0x66, + 0x4d, 0x73, 0x12, 0x53, 0x0a, 0x1b, 0x70, 0x39, 0x30, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, + 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, + 0x73, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x55, 0x49, + 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, + 0x16, 0x70, 0x39, 0x30, 0x53, 0x65, 0x65, 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x44, 0x69, 0x66, 0x66, 0x4d, 0x73, 0x12, 0x53, 0x0a, 0x1b, 0x70, 0x39, 0x35, 0x5f, 0x73, + 0x65, 0x65, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, + 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, + 0x62, 0x74, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, + 0x03, 0xe0, 0x41, 0x01, 0x52, 0x16, 0x70, 0x39, 0x35, 0x53, 0x65, 0x65, 0x6e, 0x53, 0x6c, 0x6f, + 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x69, 0x66, 0x66, 0x4d, 0x73, 0x12, 0x53, 0x0a, 0x1b, + 0x70, 0x39, 0x39, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, 0x18, 0x1c, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x46, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x16, 0x70, 0x39, 0x39, 0x53, 0x65, + 0x65, 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x69, 0x66, 0x66, 0x4d, + 0x73, 0x12, 0x53, 0x0a, 0x1b, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, 0x6c, + 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x6d, 0x73, + 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x55, 0x49, 0x6e, + 0x74, 0x33, 0x32, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x16, + 0x6d, 0x61, 0x78, 0x53, 0x65, 0x65, 0x6e, 0x53, 0x6c, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x44, 0x69, 0x66, 0x66, 0x4d, 0x73, 0x12, 0x20, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, + 0x69, 0x7a, 0x65, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x05, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x08, + 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, + 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, + 0x01, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1e, 0x0a, 0x08, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x62, 0x79, 0x18, 0x20, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, + 0xe0, 0x41, 0x01, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x22, 0xc3, 0x01, 0x0a, + 0x29, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x72, + 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x42, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x65, 0x65, 0x6b, + 0x6c, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6e, 0x0a, 0x23, 0x66, 0x63, + 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x73, 0x65, + 0x65, 0x6e, 0x5f, 0x62, 0x79, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x77, 0x65, 0x65, 0x6b, 0x6c, + 0x79, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x46, 0x63, + 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x72, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x42, + 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x65, 0x65, 0x6b, 0x6c, 0x79, 0x52, 0x1d, 0x66, 0x63, 0x74, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x72, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x42, 0x79, + 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x65, 0x65, 0x6b, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, + 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x22, 0x3d, 0x0a, 0x27, 0x47, 0x65, 0x74, 0x46, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x46, 0x69, 0x72, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x42, 0x79, 0x4e, 0x6f, 0x64, 0x65, + 0x57, 0x65, 0x65, 0x6b, 0x6c, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x77, 0x65, 0x65, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x77, 0x65, 0x65, + 0x6b, 0x22, 0x62, 0x0a, 0x28, 0x47, 0x65, 0x74, 0x46, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x46, 0x69, 0x72, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x42, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x57, + 0x65, 0x65, 0x6b, 0x6c, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, + 0x04, 0x69, 0x74, 0x65, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x63, 0x62, + 0x74, 0x2e, 0x46, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x72, 0x73, 0x74, 0x53, + 0x65, 0x65, 0x6e, 0x42, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x65, 0x65, 0x6b, 0x6c, 0x79, 0x52, + 0x04, 0x69, 0x74, 0x65, 0x6d, 0x32, 0xe4, 0x02, 0x0a, 0x24, 0x46, 0x63, 0x74, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x46, 0x69, 0x72, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x42, 0x79, 0x4e, 0x6f, 0x64, + 0x65, 0x57, 0x65, 0x65, 0x6b, 0x6c, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x9a, + 0x01, 0x0a, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2d, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x46, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x72, 0x73, 0x74, 0x53, + 0x65, 0x65, 0x6e, 0x42, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x65, 0x65, 0x6b, 0x6c, 0x79, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x46, 0x63, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x72, 0x73, 0x74, 0x53, 0x65, + 0x65, 0x6e, 0x42, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x65, 0x65, 0x6b, 0x6c, 0x79, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x33, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x12, 0x2b, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x66, 0x63, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x5f, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x62, 0x79, 0x5f, + 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x77, 0x65, 0x65, 0x6b, 0x6c, 0x79, 0x12, 0x9e, 0x01, 0x0a, 0x03, + 0x47, 0x65, 0x74, 0x12, 0x2c, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x63, 0x74, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x72, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x42, 0x79, + 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x65, 0x65, 0x6b, 0x6c, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2d, 0x2e, 0x63, 0x62, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x63, 0x74, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x72, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x42, 0x79, 0x4e, 0x6f, + 0x64, 0x65, 0x57, 0x65, 0x65, 0x6b, 0x6c, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x3a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x34, 0x12, 0x32, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, + 0x31, 0x2f, 0x66, 0x63, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x66, 0x69, 0x72, 0x73, + 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x62, 0x79, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x77, + 0x65, 0x65, 0x6b, 0x6c, 0x79, 0x2f, 0x7b, 0x77, 0x65, 0x65, 0x6b, 0x7d, 0x42, 0x36, 0x5a, 0x34, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x74, 0x68, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x6f, 0x70, 0x73, 0x2f, 0x78, 0x61, 0x74, 0x75, 0x2d, 0x63, 0x62, 0x74, 0x2f, + 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x68, + 0x6f, 0x75, 0x73, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_fct_block_first_seen_by_node_weekly_proto_rawDescOnce sync.Once + file_fct_block_first_seen_by_node_weekly_proto_rawDescData = file_fct_block_first_seen_by_node_weekly_proto_rawDesc +) + +func file_fct_block_first_seen_by_node_weekly_proto_rawDescGZIP() []byte { + file_fct_block_first_seen_by_node_weekly_proto_rawDescOnce.Do(func() { + file_fct_block_first_seen_by_node_weekly_proto_rawDescData = protoimpl.X.CompressGZIP(file_fct_block_first_seen_by_node_weekly_proto_rawDescData) + }) + return file_fct_block_first_seen_by_node_weekly_proto_rawDescData +} + +var file_fct_block_first_seen_by_node_weekly_proto_msgTypes = make([]protoimpl.MessageInfo, 5) +var file_fct_block_first_seen_by_node_weekly_proto_goTypes = []any{ + (*FctBlockFirstSeenByNodeWeekly)(nil), // 0: cbt.FctBlockFirstSeenByNodeWeekly + (*ListFctBlockFirstSeenByNodeWeeklyRequest)(nil), // 1: cbt.ListFctBlockFirstSeenByNodeWeeklyRequest + (*ListFctBlockFirstSeenByNodeWeeklyResponse)(nil), // 2: cbt.ListFctBlockFirstSeenByNodeWeeklyResponse + (*GetFctBlockFirstSeenByNodeWeeklyRequest)(nil), // 3: cbt.GetFctBlockFirstSeenByNodeWeeklyRequest + (*GetFctBlockFirstSeenByNodeWeeklyResponse)(nil), // 4: cbt.GetFctBlockFirstSeenByNodeWeeklyResponse + (*wrapperspb.DoubleValue)(nil), // 5: google.protobuf.DoubleValue + (*wrapperspb.UInt32Value)(nil), // 6: google.protobuf.UInt32Value + (*wrapperspb.StringValue)(nil), // 7: google.protobuf.StringValue + (*StringFilter)(nil), // 8: cbt.StringFilter + (*UInt32Filter)(nil), // 9: cbt.UInt32Filter + (*NullableUInt32Filter)(nil), // 10: cbt.NullableUInt32Filter + (*NullableStringFilter)(nil), // 11: cbt.NullableStringFilter + (*UInt64Filter)(nil), // 12: cbt.UInt64Filter +} +var file_fct_block_first_seen_by_node_weekly_proto_depIdxs = []int32{ + 5, // 0: cbt.FctBlockFirstSeenByNodeWeekly.meta_client_geo_longitude:type_name -> google.protobuf.DoubleValue + 5, // 1: cbt.FctBlockFirstSeenByNodeWeekly.meta_client_geo_latitude:type_name -> google.protobuf.DoubleValue + 6, // 2: cbt.FctBlockFirstSeenByNodeWeekly.meta_client_geo_autonomous_system_number:type_name -> google.protobuf.UInt32Value + 7, // 3: cbt.FctBlockFirstSeenByNodeWeekly.meta_client_geo_autonomous_system_organization:type_name -> google.protobuf.StringValue + 8, // 4: cbt.ListFctBlockFirstSeenByNodeWeeklyRequest.week:type_name -> cbt.StringFilter + 8, // 5: cbt.ListFctBlockFirstSeenByNodeWeeklyRequest.meta_client_name:type_name -> cbt.StringFilter + 9, // 6: cbt.ListFctBlockFirstSeenByNodeWeeklyRequest.updated_date_time:type_name -> cbt.UInt32Filter + 9, // 7: cbt.ListFctBlockFirstSeenByNodeWeeklyRequest.week_start_date_time:type_name -> cbt.UInt32Filter + 8, // 8: cbt.ListFctBlockFirstSeenByNodeWeeklyRequest.username:type_name -> cbt.StringFilter + 8, // 9: cbt.ListFctBlockFirstSeenByNodeWeeklyRequest.node_id:type_name -> cbt.StringFilter + 8, // 10: cbt.ListFctBlockFirstSeenByNodeWeeklyRequest.classification:type_name -> cbt.StringFilter + 8, // 11: cbt.ListFctBlockFirstSeenByNodeWeeklyRequest.meta_client_implementation:type_name -> cbt.StringFilter + 8, // 12: cbt.ListFctBlockFirstSeenByNodeWeeklyRequest.meta_client_geo_city:type_name -> cbt.StringFilter + 8, // 13: cbt.ListFctBlockFirstSeenByNodeWeeklyRequest.meta_client_geo_country:type_name -> cbt.StringFilter + 8, // 14: cbt.ListFctBlockFirstSeenByNodeWeeklyRequest.meta_client_geo_country_code:type_name -> cbt.StringFilter + 8, // 15: cbt.ListFctBlockFirstSeenByNodeWeeklyRequest.meta_client_geo_continent_code:type_name -> cbt.StringFilter + 5, // 16: cbt.ListFctBlockFirstSeenByNodeWeeklyRequest.meta_client_geo_longitude:type_name -> google.protobuf.DoubleValue + 5, // 17: cbt.ListFctBlockFirstSeenByNodeWeeklyRequest.meta_client_geo_latitude:type_name -> google.protobuf.DoubleValue + 10, // 18: cbt.ListFctBlockFirstSeenByNodeWeeklyRequest.meta_client_geo_autonomous_system_number:type_name -> cbt.NullableUInt32Filter + 11, // 19: cbt.ListFctBlockFirstSeenByNodeWeeklyRequest.meta_client_geo_autonomous_system_organization:type_name -> cbt.NullableStringFilter + 12, // 20: cbt.ListFctBlockFirstSeenByNodeWeeklyRequest.min_slot:type_name -> cbt.UInt64Filter + 12, // 21: cbt.ListFctBlockFirstSeenByNodeWeeklyRequest.max_slot:type_name -> cbt.UInt64Filter + 9, // 22: cbt.ListFctBlockFirstSeenByNodeWeeklyRequest.day_count:type_name -> cbt.UInt32Filter + 9, // 23: cbt.ListFctBlockFirstSeenByNodeWeeklyRequest.epoch_count:type_name -> cbt.UInt32Filter + 9, // 24: cbt.ListFctBlockFirstSeenByNodeWeeklyRequest.slot_count:type_name -> cbt.UInt32Filter + 9, // 25: cbt.ListFctBlockFirstSeenByNodeWeeklyRequest.min_seen_slot_start_diff_ms:type_name -> cbt.UInt32Filter + 9, // 26: cbt.ListFctBlockFirstSeenByNodeWeeklyRequest.p05_seen_slot_start_diff_ms:type_name -> cbt.UInt32Filter + 9, // 27: cbt.ListFctBlockFirstSeenByNodeWeeklyRequest.p50_seen_slot_start_diff_ms:type_name -> cbt.UInt32Filter + 9, // 28: cbt.ListFctBlockFirstSeenByNodeWeeklyRequest.avg_seen_slot_start_diff_ms:type_name -> cbt.UInt32Filter + 9, // 29: cbt.ListFctBlockFirstSeenByNodeWeeklyRequest.p90_seen_slot_start_diff_ms:type_name -> cbt.UInt32Filter + 9, // 30: cbt.ListFctBlockFirstSeenByNodeWeeklyRequest.p95_seen_slot_start_diff_ms:type_name -> cbt.UInt32Filter + 9, // 31: cbt.ListFctBlockFirstSeenByNodeWeeklyRequest.p99_seen_slot_start_diff_ms:type_name -> cbt.UInt32Filter + 9, // 32: cbt.ListFctBlockFirstSeenByNodeWeeklyRequest.max_seen_slot_start_diff_ms:type_name -> cbt.UInt32Filter + 0, // 33: cbt.ListFctBlockFirstSeenByNodeWeeklyResponse.fct_block_first_seen_by_node_weekly:type_name -> cbt.FctBlockFirstSeenByNodeWeekly + 0, // 34: cbt.GetFctBlockFirstSeenByNodeWeeklyResponse.item:type_name -> cbt.FctBlockFirstSeenByNodeWeekly + 1, // 35: cbt.FctBlockFirstSeenByNodeWeeklyService.List:input_type -> cbt.ListFctBlockFirstSeenByNodeWeeklyRequest + 3, // 36: cbt.FctBlockFirstSeenByNodeWeeklyService.Get:input_type -> cbt.GetFctBlockFirstSeenByNodeWeeklyRequest + 2, // 37: cbt.FctBlockFirstSeenByNodeWeeklyService.List:output_type -> cbt.ListFctBlockFirstSeenByNodeWeeklyResponse + 4, // 38: cbt.FctBlockFirstSeenByNodeWeeklyService.Get:output_type -> cbt.GetFctBlockFirstSeenByNodeWeeklyResponse + 37, // [37:39] is the sub-list for method output_type + 35, // [35:37] is the sub-list for method input_type + 35, // [35:35] is the sub-list for extension type_name + 35, // [35:35] is the sub-list for extension extendee + 0, // [0:35] is the sub-list for field type_name +} + +func init() { file_fct_block_first_seen_by_node_weekly_proto_init() } +func file_fct_block_first_seen_by_node_weekly_proto_init() { + if File_fct_block_first_seen_by_node_weekly_proto != nil { + return + } + file_common_proto_init() + if !protoimpl.UnsafeEnabled { + file_fct_block_first_seen_by_node_weekly_proto_msgTypes[0].Exporter = func(v any, i int) any { + switch v := v.(*FctBlockFirstSeenByNodeWeekly); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_fct_block_first_seen_by_node_weekly_proto_msgTypes[1].Exporter = func(v any, i int) any { + switch v := v.(*ListFctBlockFirstSeenByNodeWeeklyRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_fct_block_first_seen_by_node_weekly_proto_msgTypes[2].Exporter = func(v any, i int) any { + switch v := v.(*ListFctBlockFirstSeenByNodeWeeklyResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_fct_block_first_seen_by_node_weekly_proto_msgTypes[3].Exporter = func(v any, i int) any { + switch v := v.(*GetFctBlockFirstSeenByNodeWeeklyRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_fct_block_first_seen_by_node_weekly_proto_msgTypes[4].Exporter = func(v any, i int) any { + switch v := v.(*GetFctBlockFirstSeenByNodeWeeklyResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_fct_block_first_seen_by_node_weekly_proto_rawDesc, + NumEnums: 0, + NumMessages: 5, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_fct_block_first_seen_by_node_weekly_proto_goTypes, + DependencyIndexes: file_fct_block_first_seen_by_node_weekly_proto_depIdxs, + MessageInfos: file_fct_block_first_seen_by_node_weekly_proto_msgTypes, + }.Build() + File_fct_block_first_seen_by_node_weekly_proto = out.File + file_fct_block_first_seen_by_node_weekly_proto_rawDesc = nil + file_fct_block_first_seen_by_node_weekly_proto_goTypes = nil + file_fct_block_first_seen_by_node_weekly_proto_depIdxs = nil +} diff --git a/pkg/proto/clickhouse/fct_block_first_seen_by_node_weekly.proto b/pkg/proto/clickhouse/fct_block_first_seen_by_node_weekly.proto new file mode 100644 index 00000000..0825cf79 --- /dev/null +++ b/pkg/proto/clickhouse/fct_block_first_seen_by_node_weekly.proto @@ -0,0 +1,185 @@ +syntax = "proto3"; + +package cbt; + +import "common.proto"; +import "google/protobuf/wrappers.proto"; +import "google/api/annotations.proto"; +import "google/api/field_behavior.proto"; +import "clickhouse/annotations.proto"; + +option go_package = "github.com/ethpandaops/xatu-cbt/pkg/proto/clickhouse"; +// Block first seen statistics by node aggregated by week + +message FctBlockFirstSeenByNodeWeekly { + // Timestamp when the record was last updated + uint32 updated_date_time = 11; + // Start of week (Monday) + string week = 12; + // Start of week at midnight UTC (Monday) + uint32 week_start_date_time = 13; + // Username of the node + string username = 14; + // ID of the node + string node_id = 15; + // Classification of the node, e.g. "individual", "corporate", "internal" (aka ethPandaOps) or "unclassified" + string classification = 16; + // Name of the client + string meta_client_name = 17; + // Implementation of the client + string meta_client_implementation = 18; + // City of the client + string meta_client_geo_city = 19; + // Country of the client + string meta_client_geo_country = 20; + // Country code of the client + string meta_client_geo_country_code = 21; + // Continent code of the client + string meta_client_geo_continent_code = 22; + // Longitude of the client + google.protobuf.DoubleValue meta_client_geo_longitude = 23; + // Latitude of the client + google.protobuf.DoubleValue meta_client_geo_latitude = 24; + // Autonomous system number of the client + google.protobuf.UInt32Value meta_client_geo_autonomous_system_number = 25; + // Autonomous system organization of the client + google.protobuf.StringValue meta_client_geo_autonomous_system_organization = 26; + // Minimum slot number in this week + uint64 min_slot = 27; + // Maximum slot number in this week + uint64 max_slot = 28; + // Number of days in this week + uint32 day_count = 29; + // Number of epochs in this week + uint32 epoch_count = 30; + // Number of slots with blocks seen in this week + uint32 slot_count = 31; + // Minimum time from slot start for the node to see a block (milliseconds) + uint32 min_seen_slot_start_diff_ms = 32; + // 5th percentile time from slot start (milliseconds) + uint32 p05_seen_slot_start_diff_ms = 33; + // Median (p50) time from slot start (milliseconds) + uint32 p50_seen_slot_start_diff_ms = 34; + // Average time from slot start (milliseconds) + uint32 avg_seen_slot_start_diff_ms = 35; + // 90th percentile time from slot start (milliseconds) + uint32 p90_seen_slot_start_diff_ms = 36; + // 95th percentile time from slot start (milliseconds) + uint32 p95_seen_slot_start_diff_ms = 37; + // 99th percentile time from slot start (milliseconds) + uint32 p99_seen_slot_start_diff_ms = 38; + // Maximum time from slot start (milliseconds) + uint32 max_seen_slot_start_diff_ms = 39; +} + +// Request for listing fct_block_first_seen_by_node_weekly records +message ListFctBlockFirstSeenByNodeWeeklyRequest { + // Filter by week - Start of week (Monday) (PRIMARY KEY - required) + StringFilter week = 1 [(google.api.field_behavior) = REQUIRED, (clickhouse.v1.required_group) = "primary_key"]; + + // Filter by meta_client_name - Name of the client (ORDER BY column 2 - optional) + StringFilter meta_client_name = 2 [(google.api.field_behavior) = OPTIONAL]; + + // Filter by updated_date_time - Timestamp when the record was last updated (optional) + UInt32Filter updated_date_time = 3 [(google.api.field_behavior) = OPTIONAL]; + // Filter by week_start_date_time - Start of week at midnight UTC (Monday) (optional) + UInt32Filter week_start_date_time = 4 [(google.api.field_behavior) = OPTIONAL]; + // Filter by username - Username of the node (optional) + StringFilter username = 5 [(google.api.field_behavior) = OPTIONAL]; + // Filter by node_id - ID of the node (optional) + StringFilter node_id = 6 [(google.api.field_behavior) = OPTIONAL]; + // Filter by classification - Classification of the node, e.g. "individual", "corporate", "internal" (aka ethPandaOps) or "unclassified" (optional) + StringFilter classification = 7 [(google.api.field_behavior) = OPTIONAL]; + // Filter by meta_client_implementation - Implementation of the client (optional) + StringFilter meta_client_implementation = 8 [(google.api.field_behavior) = OPTIONAL]; + // Filter by meta_client_geo_city - City of the client (optional) + StringFilter meta_client_geo_city = 9 [(google.api.field_behavior) = OPTIONAL]; + // Filter by meta_client_geo_country - Country of the client (optional) + StringFilter meta_client_geo_country = 10 [(google.api.field_behavior) = OPTIONAL]; + // Filter by meta_client_geo_country_code - Country code of the client (optional) + StringFilter meta_client_geo_country_code = 11 [(google.api.field_behavior) = OPTIONAL]; + // Filter by meta_client_geo_continent_code - Continent code of the client (optional) + StringFilter meta_client_geo_continent_code = 12 [(google.api.field_behavior) = OPTIONAL]; + // Filter by meta_client_geo_longitude - Longitude of the client (optional) + google.protobuf.DoubleValue meta_client_geo_longitude = 13 [(google.api.field_behavior) = OPTIONAL]; + // Filter by meta_client_geo_latitude - Latitude of the client (optional) + google.protobuf.DoubleValue meta_client_geo_latitude = 14 [(google.api.field_behavior) = OPTIONAL]; + // Filter by meta_client_geo_autonomous_system_number - Autonomous system number of the client (optional) + NullableUInt32Filter meta_client_geo_autonomous_system_number = 15 [(google.api.field_behavior) = OPTIONAL]; + // Filter by meta_client_geo_autonomous_system_organization - Autonomous system organization of the client (optional) + NullableStringFilter meta_client_geo_autonomous_system_organization = 16 [(google.api.field_behavior) = OPTIONAL]; + // Filter by min_slot - Minimum slot number in this week (optional) + UInt64Filter min_slot = 17 [(google.api.field_behavior) = OPTIONAL]; + // Filter by max_slot - Maximum slot number in this week (optional) + UInt64Filter max_slot = 18 [(google.api.field_behavior) = OPTIONAL]; + // Filter by day_count - Number of days in this week (optional) + UInt32Filter day_count = 19 [(google.api.field_behavior) = OPTIONAL]; + // Filter by epoch_count - Number of epochs in this week (optional) + UInt32Filter epoch_count = 20 [(google.api.field_behavior) = OPTIONAL]; + // Filter by slot_count - Number of slots with blocks seen in this week (optional) + UInt32Filter slot_count = 21 [(google.api.field_behavior) = OPTIONAL]; + // Filter by min_seen_slot_start_diff_ms - Minimum time from slot start for the node to see a block (milliseconds) (optional) + UInt32Filter min_seen_slot_start_diff_ms = 22 [(google.api.field_behavior) = OPTIONAL]; + // Filter by p05_seen_slot_start_diff_ms - 5th percentile time from slot start (milliseconds) (optional) + UInt32Filter p05_seen_slot_start_diff_ms = 23 [(google.api.field_behavior) = OPTIONAL]; + // Filter by p50_seen_slot_start_diff_ms - Median (p50) time from slot start (milliseconds) (optional) + UInt32Filter p50_seen_slot_start_diff_ms = 24 [(google.api.field_behavior) = OPTIONAL]; + // Filter by avg_seen_slot_start_diff_ms - Average time from slot start (milliseconds) (optional) + UInt32Filter avg_seen_slot_start_diff_ms = 25 [(google.api.field_behavior) = OPTIONAL]; + // Filter by p90_seen_slot_start_diff_ms - 90th percentile time from slot start (milliseconds) (optional) + UInt32Filter p90_seen_slot_start_diff_ms = 26 [(google.api.field_behavior) = OPTIONAL]; + // Filter by p95_seen_slot_start_diff_ms - 95th percentile time from slot start (milliseconds) (optional) + UInt32Filter p95_seen_slot_start_diff_ms = 27 [(google.api.field_behavior) = OPTIONAL]; + // Filter by p99_seen_slot_start_diff_ms - 99th percentile time from slot start (milliseconds) (optional) + UInt32Filter p99_seen_slot_start_diff_ms = 28 [(google.api.field_behavior) = OPTIONAL]; + // Filter by max_seen_slot_start_diff_ms - Maximum time from slot start (milliseconds) (optional) + UInt32Filter max_seen_slot_start_diff_ms = 29 [(google.api.field_behavior) = OPTIONAL]; + + // The maximum number of fct_block_first_seen_by_node_weekly to return. + // If unspecified, at most 100 items will be returned. + // The maximum value is 10000; values above 10000 will be coerced to 10000. + int32 page_size = 30 [(google.api.field_behavior) = OPTIONAL]; + // A page token, received from a previous `ListFctBlockFirstSeenByNodeWeekly` call. + // Provide this to retrieve the subsequent page. + string page_token = 31 [(google.api.field_behavior) = OPTIONAL]; + // The order of results. Format: comma-separated list of fields. + // Example: "foo,bar" or "foo desc,bar" for descending order on foo. + // If unspecified, results will be returned in the default order. + string order_by = 32 [(google.api.field_behavior) = OPTIONAL]; +} + +// Response for listing fct_block_first_seen_by_node_weekly records +message ListFctBlockFirstSeenByNodeWeeklyResponse { + // The list of fct_block_first_seen_by_node_weekly. + repeated FctBlockFirstSeenByNodeWeekly fct_block_first_seen_by_node_weekly = 1; + // A token, which can be sent as `page_token` to retrieve the next page. + // If this field is omitted, there are no subsequent pages. + string next_page_token = 2; +} + +// Request for getting a single fct_block_first_seen_by_node_weekly record by primary key +message GetFctBlockFirstSeenByNodeWeeklyRequest { + // Start of week (Monday) + string week = 1; // Primary key (required) +} + +// Response for getting a single fct_block_first_seen_by_node_weekly record +message GetFctBlockFirstSeenByNodeWeeklyResponse { + FctBlockFirstSeenByNodeWeekly item = 1; +} + +// Query fct_block_first_seen_by_node_weekly data +service FctBlockFirstSeenByNodeWeeklyService { + // List records | Retrieve paginated results with optional filtering + rpc List(ListFctBlockFirstSeenByNodeWeeklyRequest) returns (ListFctBlockFirstSeenByNodeWeeklyResponse) { + option (google.api.http) = { + get: "/api/v1/fct_block_first_seen_by_node_weekly" + }; + } + // Get record | Retrieve a single record by week + rpc Get(GetFctBlockFirstSeenByNodeWeeklyRequest) returns (GetFctBlockFirstSeenByNodeWeeklyResponse) { + option (google.api.http) = { + get: "/api/v1/fct_block_first_seen_by_node_weekly/{week}" + }; + } +} diff --git a/tests/mainnet/pectra/assertions/fct_block_first_seen_by_node_by_epoch.yaml b/tests/mainnet/pectra/assertions/fct_block_first_seen_by_node_by_epoch.yaml new file mode 100644 index 00000000..715b8a86 --- /dev/null +++ b/tests/mainnet/pectra/assertions/fct_block_first_seen_by_node_by_epoch.yaml @@ -0,0 +1,24 @@ +- name: "Expected bounds and size" + sql: | + SELECT + COUNT(*) AS count, + MIN(epoch_start_date_time) AS min, + MAX(epoch_start_date_time) AS max + FROM + fct_block_first_seen_by_node_by_epoch FINAL + expected: + count: 238 + min: "2025-07-15T08:29:11Z" + max: "2025-07-15T08:35:35Z" +- name: "Expected admin bounds" + sql: | + SELECT + fromUnixTimestamp(MAX(position + interval)) AS max, + fromUnixTimestamp(MIN(position)) AS min + FROM + admin_cbt_incremental FINAL + WHERE + table = 'fct_block_first_seen_by_node_by_epoch' + expected: + max: "2025-07-15T08:38:11Z" + min: "2025-07-15T08:34:23Z" diff --git a/tests/mainnet/pectra/assertions/fct_block_first_seen_by_node_daily.yaml b/tests/mainnet/pectra/assertions/fct_block_first_seen_by_node_daily.yaml new file mode 100644 index 00000000..6d261dba --- /dev/null +++ b/tests/mainnet/pectra/assertions/fct_block_first_seen_by_node_daily.yaml @@ -0,0 +1,24 @@ +- name: "Expected bounds and size" + sql: | + SELECT + COUNT(*) AS count, + MIN(day_start_date_time) AS min, + MAX(day_start_date_time) AS max + FROM + fct_block_first_seen_by_node_daily FINAL + expected: + count: 119 + min: "2025-07-15T00:00:00Z" + max: "2025-07-15T00:00:00Z" +- name: "Expected admin bounds" + sql: | + SELECT + fromUnixTimestamp(MAX(position + interval)) AS max, + fromUnixTimestamp(MIN(position)) AS min + FROM + admin_cbt_incremental FINAL + WHERE + table = 'fct_block_first_seen_by_node_daily' + expected: + max: "2025-07-15T08:38:11Z" + min: "2025-07-15T08:34:23Z" diff --git a/tests/mainnet/pectra/assertions/fct_block_first_seen_by_node_monthly.yaml b/tests/mainnet/pectra/assertions/fct_block_first_seen_by_node_monthly.yaml new file mode 100644 index 00000000..0fe118c4 --- /dev/null +++ b/tests/mainnet/pectra/assertions/fct_block_first_seen_by_node_monthly.yaml @@ -0,0 +1,24 @@ +- name: "Expected bounds and size" + sql: | + SELECT + COUNT(*) AS count, + MIN(month_start_date_time) AS min, + MAX(month_start_date_time) AS max + FROM + fct_block_first_seen_by_node_monthly FINAL + expected: + count: 119 + min: "2025-07-01T00:00:00Z" + max: "2025-07-01T00:00:00Z" +- name: "Expected admin bounds" + sql: | + SELECT + fromUnixTimestamp(MAX(position + interval)) AS max, + fromUnixTimestamp(MIN(position)) AS min + FROM + admin_cbt_incremental FINAL + WHERE + table = 'fct_block_first_seen_by_node_monthly' + expected: + max: "2025-07-15T08:38:11Z" + min: "2025-07-15T08:34:23Z" diff --git a/tests/mainnet/pectra/assertions/fct_block_first_seen_by_node_weekly.yaml b/tests/mainnet/pectra/assertions/fct_block_first_seen_by_node_weekly.yaml new file mode 100644 index 00000000..0209ea21 --- /dev/null +++ b/tests/mainnet/pectra/assertions/fct_block_first_seen_by_node_weekly.yaml @@ -0,0 +1,24 @@ +- name: "Expected bounds and size" + sql: | + SELECT + COUNT(*) AS count, + MIN(week_start_date_time) AS min, + MAX(week_start_date_time) AS max + FROM + fct_block_first_seen_by_node_weekly FINAL + expected: + count: 119 + min: "2025-07-13T00:00:00Z" + max: "2025-07-13T00:00:00Z" +- name: "Expected admin bounds" + sql: | + SELECT + fromUnixTimestamp(MAX(position + interval)) AS max, + fromUnixTimestamp(MIN(position)) AS min + FROM + admin_cbt_incremental FINAL + WHERE + table = 'fct_block_first_seen_by_node_weekly' + expected: + max: "2025-07-15T08:38:11Z" + min: "2025-07-15T08:34:23Z" diff --git a/tests/sepolia/fusaka/assertions/fct_block_first_seen_by_node_by_epoch.yaml b/tests/sepolia/fusaka/assertions/fct_block_first_seen_by_node_by_epoch.yaml new file mode 100644 index 00000000..e3615a4b --- /dev/null +++ b/tests/sepolia/fusaka/assertions/fct_block_first_seen_by_node_by_epoch.yaml @@ -0,0 +1,24 @@ +- name: "Expected bounds and size" + sql: | + SELECT + COUNT(*) AS count, + MIN(epoch_start_date_time) AS min, + MAX(epoch_start_date_time) AS max + FROM + fct_block_first_seen_by_node_by_epoch FINAL + expected: + count: 70 + min: "2025-10-27T00:20:48Z" + max: "2025-10-27T00:27:12Z" +- name: "Expected admin bounds" + sql: | + SELECT + fromUnixTimestamp(MAX(position + interval)) AS max, + fromUnixTimestamp(MIN(position)) AS min + FROM + admin_cbt_incremental FINAL + WHERE + table = 'fct_block_first_seen_by_node_by_epoch' + expected: + max: "2025-10-27T00:30:24Z" + min: "2025-10-27T00:26:36Z" diff --git a/tests/sepolia/fusaka/assertions/fct_block_first_seen_by_node_daily.yaml b/tests/sepolia/fusaka/assertions/fct_block_first_seen_by_node_daily.yaml new file mode 100644 index 00000000..acce6a90 --- /dev/null +++ b/tests/sepolia/fusaka/assertions/fct_block_first_seen_by_node_daily.yaml @@ -0,0 +1,24 @@ +- name: "Expected bounds and size" + sql: | + SELECT + COUNT(*) AS count, + MIN(day_start_date_time) AS min, + MAX(day_start_date_time) AS max + FROM + fct_block_first_seen_by_node_daily FINAL + expected: + count: 35 + min: "2025-10-27T00:00:00Z" + max: "2025-10-27T00:00:00Z" +- name: "Expected admin bounds" + sql: | + SELECT + fromUnixTimestamp(MAX(position + interval)) AS max, + fromUnixTimestamp(MIN(position)) AS min + FROM + admin_cbt_incremental FINAL + WHERE + table = 'fct_block_first_seen_by_node_daily' + expected: + max: "2025-10-27T00:30:24Z" + min: "2025-10-27T00:26:36Z" diff --git a/tests/sepolia/fusaka/assertions/fct_block_first_seen_by_node_monthly.yaml b/tests/sepolia/fusaka/assertions/fct_block_first_seen_by_node_monthly.yaml new file mode 100644 index 00000000..88d03a5e --- /dev/null +++ b/tests/sepolia/fusaka/assertions/fct_block_first_seen_by_node_monthly.yaml @@ -0,0 +1,24 @@ +- name: "Expected bounds and size" + sql: | + SELECT + COUNT(*) AS count, + MIN(month_start_date_time) AS min, + MAX(month_start_date_time) AS max + FROM + fct_block_first_seen_by_node_monthly FINAL + expected: + count: 35 + min: "2025-10-01T00:00:00Z" + max: "2025-10-01T00:00:00Z" +- name: "Expected admin bounds" + sql: | + SELECT + fromUnixTimestamp(MAX(position + interval)) AS max, + fromUnixTimestamp(MIN(position)) AS min + FROM + admin_cbt_incremental FINAL + WHERE + table = 'fct_block_first_seen_by_node_monthly' + expected: + max: "2025-10-27T00:30:24Z" + min: "2025-10-27T00:26:36Z" diff --git a/tests/sepolia/fusaka/assertions/fct_block_first_seen_by_node_weekly.yaml b/tests/sepolia/fusaka/assertions/fct_block_first_seen_by_node_weekly.yaml new file mode 100644 index 00000000..df449eee --- /dev/null +++ b/tests/sepolia/fusaka/assertions/fct_block_first_seen_by_node_weekly.yaml @@ -0,0 +1,24 @@ +- name: "Expected bounds and size" + sql: | + SELECT + COUNT(*) AS count, + MIN(week_start_date_time) AS min, + MAX(week_start_date_time) AS max + FROM + fct_block_first_seen_by_node_weekly FINAL + expected: + count: 35 + min: "2025-10-26T00:00:00Z" + max: "2025-10-26T00:00:00Z" +- name: "Expected admin bounds" + sql: | + SELECT + fromUnixTimestamp(MAX(position + interval)) AS max, + fromUnixTimestamp(MIN(position)) AS min + FROM + admin_cbt_incremental FINAL + WHERE + table = 'fct_block_first_seen_by_node_weekly' + expected: + max: "2025-10-27T00:30:24Z" + min: "2025-10-27T00:26:36Z"