sql-scripts/chocolate_ai/geofencing_continuous_query.sql (79 lines of code) (raw):

/*################################################################################## # Copyright 2024 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. ###################################################################################*/ /* CREATE RESERVATION `data-analytics-preview.region-us.continuous-query-reservation` OPTIONS ( edition = "enterprise", slot_capacity = 50); CREATE ASSIGNMENT `data-analytics-preview.region-us.continuous-query-reservation.continuous-query-reservation-assignment` OPTIONS( assignee = "projects/data-analytics-preview", job_type = "CONTINUOUS"); DROP ASSIGNMENT `data-analytics-preview.region-us.continuous-query-reservation.continuous-query-reservation-assignment`; DROP RESERVATION `data-analytics-preview.region-us.continuous-query-reservation`; -- Create Service Account -- Grant BQ access -- Grant access to dataset -- Grant access to Pub/Sub EXPORT DATA OPTIONS(uri="https://pubsub.googleapis.com/projects/data-analytics-preview/topics/bq-continuous-query", format="cloud_pubsub") AS SELECT TO_JSON_STRING(STRUCT(customer_id, current_latitude, current_longitude, debug_map_url)) AS message, TO_JSON(STRUCT(CAST(TIMESTAMP_MILLIS(event_timestamp_millis) AS STRING) AS event_timestamp)) AS _ATTRIBUTES FROM `data-analytics-preview.chocolate_ai.customer_geo_location`; kafka-continuous-query@data-analytics-preview.iam.gserviceaccount.com */ /* EXPORT DATA OPTIONS(uri="https://pubsub.googleapis.com/projects/data-analytics-preview/topics/bq-continuous-query", format="cloud_pubsub") AS SELECT TO_JSON_STRING(STRUCT(customer_id, current_latitude, current_longitude, debug_map_url)) AS message, TO_JSON(STRUCT(CAST(TIMESTAMP_MILLIS(event_timestamp_millis) AS STRING) AS event_timestamp)) AS _ATTRIBUTES FROM `data-analytics-preview.chocolate_ai.customer_geo_location`; */ ---------------------------------------------------------------------------------------------------------------- -- Insert the customers who break the geo-boundry into Pub/Sub and then a process (e.g. Cloud Function) will send them an alert ---------------------------------------------------------------------------------------------------------------- EXPORT DATA OPTIONS(uri="https://pubsub.googleapis.com/projects/data-analytics-preview/topics/bq-continuous-query", format="cloud_pubsub") AS WITH raw_data AS ( SELECT * FROM `data-analytics-preview.chocolate_ai.customer_geo_location` ) , geo_data AS ( SELECT *, ST_DISTANCE( ST_GEOGPOINT(prior_longitude, prior_latitude), ST_GEOGPOINT(current_longitude, current_latitude) ) AS meters_travel_since_prior_distance, ST_DISTANCE( ST_GEOGPOINT(current_longitude, current_latitude), ST_GEOGPOINT(debug_destination_longitude, debug_destination_latitude) ) AS meters_to_dest_distance, ST_DISTANCE( ST_GEOGPOINT(current_longitude, current_latitude), ST_GEOGPOINT(debug_destination_longitude, debug_destination_latitude) ) / 1000 AS km_to_dest_distance, FROM raw_data ) , results AS ( SELECT *, CASE WHEN meters_to_dest_distance > 1000 AND meters_to_dest_distance - meters_travel_since_prior_distance < 1000 THEN TRUE ELSE FALSE END AS entered_geofence FROM geo_data ) SELECT TO_JSON_STRING(STRUCT(customer_geo_location_id, customer_id, current_latitude, current_longitude, km_to_dest_distance, debug_map_url)) AS message, TO_JSON(STRUCT(CAST(TIMESTAMP_MILLIS(event_timestamp_millis) AS STRING) AS event_timestamp)) AS _ATTRIBUTES FROM results where entered_geofence = true; ---------------------------------------------------------------------------------------------------------------- -- Insert the customers who break the geo-boundry into another BigQuery table ---------------------------------------------------------------------------------------------------------------- INSERT INTO `data-analytics-preview.chocolate_ai.customer_geo_location_results` WITH raw_data AS ( SELECT * FROM `data-analytics-preview.chocolate_ai.customer_geo_location` ) , geo_data AS ( SELECT *, ST_DISTANCE( ST_GEOGPOINT(prior_longitude, prior_latitude), ST_GEOGPOINT(current_longitude, current_latitude) ) AS meters_travel_since_prior_distance, ST_DISTANCE( ST_GEOGPOINT(current_longitude, current_latitude), ST_GEOGPOINT(debug_destination_longitude, debug_destination_latitude) ) AS meters_to_dest_distance, ST_DISTANCE( ST_GEOGPOINT(current_longitude, current_latitude), ST_GEOGPOINT(debug_destination_longitude, debug_destination_latitude) ) / 1000 AS km_to_dest_distance, FROM raw_data ) , results AS ( SELECT *, CASE WHEN meters_to_dest_distance > 1000 AND meters_to_dest_distance - meters_travel_since_prior_distance < 1000 THEN TRUE ELSE FALSE END AS entered_geofence FROM geo_data ) SELECT customer_geo_location_id, customer_id, current_latitude, current_longitude, km_to_dest_distance, debug_map_url, event_timestamp_millis, CURRENT_TIMESTAMP() AS geo_boundry_entry_timestamp FROM results where entered_geofence = true;