diff --git a/clouds/snowflake/modules/sql/quadbin/QUADBIN_FROMLONGLAT.sql b/clouds/snowflake/modules/sql/quadbin/QUADBIN_FROMLONGLAT.sql index 0ee2eafcd..ea1543d83 100644 --- a/clouds/snowflake/modules/sql/quadbin/QUADBIN_FROMLONGLAT.sql +++ b/clouds/snowflake/modules/sql/quadbin/QUADBIN_FROMLONGLAT.sql @@ -1,6 +1,6 @@ ----------------------------- --- Copyright (C) 2022 CARTO ----------------------------- +-------------------------------- +-- Copyright (C) 2022-2023 CARTO +-------------------------------- CREATE OR REPLACE SECURE FUNCTION @@SF_SCHEMA@@.QUADBIN_FROMLONGLAT (longitude FLOAT, latitude FLOAT, resolution INT) @@ -16,13 +16,13 @@ AS $$ SELECT resolution AS z, ACOS(-1) AS PI, - GREATEST(-85.05, LEAST(85.05, latitude)) AS latitude + GREATEST(-85.05, LEAST(85.05, latitude)) AS params_latitude ), __zxy AS ( SELECT z, - bitand( CAST(FLOOR(BITSHIFTLEFT(1, z) * ((longitude / 360.0) + 0.5)) AS INT), (BITSHIFTLEFT(1, z) - 1)) AS x, - bitand( CAST(FLOOR(BITSHIFTLEFT(1, z) * (0.5 - (LN(TAN(PI/4.0 + latitude/2.0 * PI/180.0)) / (2*PI)))) AS INT), + BITAND( CAST(FLOOR(BITSHIFTLEFT(1, z) * ((longitude / 360.0) + 0.5)) AS INT), (BITSHIFTLEFT(1, z) - 1)) AS x, + BITAND( CAST(FLOOR(BITSHIFTLEFT(1, z) * (0.5 - (LN(TAN(PI/4.0 + params_latitude/2.0 * PI/180.0)) / (2*PI)))) AS INT), (BITSHIFTLEFT(1, z) - 1)) AS y FROM __params ) diff --git a/clouds/snowflake/modules/sql/quadbin/QUADBIN_FROMQUADKEY.sql b/clouds/snowflake/modules/sql/quadbin/QUADBIN_FROMQUADKEY.sql index d8991f85a..ac37f8e22 100644 --- a/clouds/snowflake/modules/sql/quadbin/QUADBIN_FROMQUADKEY.sql +++ b/clouds/snowflake/modules/sql/quadbin/QUADBIN_FROMQUADKEY.sql @@ -1,6 +1,6 @@ ----------------------------- --- Copyright (C) 2022 CARTO ----------------------------- +-------------------------------- +-- Copyright (C) 2022-2023 CARTO +-------------------------------- CREATE OR REPLACE FUNCTION @@SF_SCHEMA@@._QUADBIN_FROMQUADKEY (quadkey STRING) @@ -22,5 +22,8 @@ CREATE OR REPLACE FUNCTION @@SF_SCHEMA@@.QUADBIN_FROMQUADKEY RETURNS BIGINT IMMUTABLE AS $$ - SELECT CAST(@@SF_SCHEMA@@._QUADBIN_FROMQUADKEY(QUADKEY) AS BIGINT) + IFF(quadkey IS NULL, + NULL, + CAST(@@SF_SCHEMA@@._QUADBIN_FROMQUADKEY(QUADKEY) AS BIGINT) + ) $$; diff --git a/clouds/snowflake/modules/sql/quadbin/QUADBIN_FROMZXY.sql b/clouds/snowflake/modules/sql/quadbin/QUADBIN_FROMZXY.sql index 008e1c29b..6404b8895 100644 --- a/clouds/snowflake/modules/sql/quadbin/QUADBIN_FROMZXY.sql +++ b/clouds/snowflake/modules/sql/quadbin/QUADBIN_FROMZXY.sql @@ -1,6 +1,6 @@ ----------------------------- --- Copyright (C) 2022 CARTO ----------------------------- +-------------------------------- +-- Copyright (C) 2022-2023 CARTO +-------------------------------- CREATE OR REPLACE FUNCTION @@SF_SCHEMA@@._QUADBIN_FROMZXY (z DOUBLE, x DOUBLE, y DOUBLE) @@ -25,7 +25,10 @@ CREATE OR REPLACE SECURE FUNCTION @@SF_SCHEMA@@.QUADBIN_FROMZXY RETURNS BIGINT IMMUTABLE AS $$ - @@SF_SCHEMA@@._QUADBIN_STRING_TOINT( - @@SF_SCHEMA@@._QUADBIN_FROMZXY(Z, X, Y) + IFF(z IS NULL OR x IS NULL OR y IS NULL, + NULL, + @@SF_SCHEMA@@._QUADBIN_STRING_TOINT( + @@SF_SCHEMA@@._QUADBIN_FROMZXY(Z, X, Y) + ) ) $$; diff --git a/clouds/snowflake/modules/sql/quadbin/QUADBIN_KRING.sql b/clouds/snowflake/modules/sql/quadbin/QUADBIN_KRING.sql index 6e4819ad6..7c56caa8f 100644 --- a/clouds/snowflake/modules/sql/quadbin/QUADBIN_KRING.sql +++ b/clouds/snowflake/modules/sql/quadbin/QUADBIN_KRING.sql @@ -1,6 +1,6 @@ ----------------------------- --- Copyright (C) 2022 CARTO ----------------------------- +-------------------------------- +-- Copyright (C) 2022-2023 CARTO +-------------------------------- -- The function returns a STRING for two main issues related with Snowflake limitations -- 1. Snowflake has a native support of BigInt numbers, however, if the UDF @@ -14,5 +14,8 @@ CREATE OR REPLACE SECURE FUNCTION @@SF_SCHEMA@@.QUADBIN_KRING RETURNS ARRAY IMMUTABLE AS $$ - TO_ARRAY(PARSE_JSON(@@SF_SCHEMA@@._QUADBIN_KRING(TO_VARCHAR(ORIGIN, 'xxxxxxxxxxxxxxxx'), SIZE, false))) + IFF(origin IS NULL OR size IS NULL, + NULL, + TO_ARRAY(PARSE_JSON(@@SF_SCHEMA@@._QUADBIN_KRING(TO_VARCHAR(ORIGIN, 'xxxxxxxxxxxxxxxx'), SIZE, false))) + ) $$; diff --git a/clouds/snowflake/modules/sql/quadbin/QUADBIN_KRING_DISTANCES.sql b/clouds/snowflake/modules/sql/quadbin/QUADBIN_KRING_DISTANCES.sql index e75e7f9eb..80ec7e764 100644 --- a/clouds/snowflake/modules/sql/quadbin/QUADBIN_KRING_DISTANCES.sql +++ b/clouds/snowflake/modules/sql/quadbin/QUADBIN_KRING_DISTANCES.sql @@ -1,6 +1,6 @@ ----------------------------- --- Copyright (C) 2022 CARTO ----------------------------- +-------------------------------- +-- Copyright (C) 2022-2023 CARTO +-------------------------------- -- The function returns a STRING for two main issues related with Snowflake limitations -- 1. Snowflake has a native support of BigInt numbers, however, if the UDF @@ -14,5 +14,8 @@ CREATE OR REPLACE SECURE FUNCTION @@SF_SCHEMA@@.QUADBIN_KRING_DISTANCES RETURNS ARRAY IMMUTABLE AS $$ - TO_ARRAY(PARSE_JSON(@@SF_SCHEMA@@._QUADBIN_KRING(TO_VARCHAR(ORIGIN, 'xxxxxxxxxxxxxxxx'), SIZE, true))) + IFF(origin IS NULL OR size IS NULL, + NULL, + TO_ARRAY(PARSE_JSON(@@SF_SCHEMA@@._QUADBIN_KRING(TO_VARCHAR(ORIGIN, 'xxxxxxxxxxxxxxxx'), SIZE, true))) + ) $$; diff --git a/clouds/snowflake/modules/sql/quadbin/QUADBIN_SIBLING.sql b/clouds/snowflake/modules/sql/quadbin/QUADBIN_SIBLING.sql index c79ec79fd..877711c64 100644 --- a/clouds/snowflake/modules/sql/quadbin/QUADBIN_SIBLING.sql +++ b/clouds/snowflake/modules/sql/quadbin/QUADBIN_SIBLING.sql @@ -1,6 +1,6 @@ ----------------------------- --- Copyright (C) 2022 CARTO ----------------------------- +-------------------------------- +-- Copyright (C) 2022-2023 CARTO +-------------------------------- -- FIXME: slow @@ -9,16 +9,19 @@ CREATE OR REPLACE SECURE FUNCTION @@SF_SCHEMA@@.QUADBIN_SIBLING RETURNS INT IMMUTABLE AS $$ - CASE direction - WHEN 'left' THEN - @@SF_SCHEMA@@._QUADBIN_SIBLING(quadbin, -1, 0) - WHEN 'right' THEN - @@SF_SCHEMA@@._QUADBIN_SIBLING(quadbin, 1, 0) - WHEN 'up' THEN - @@SF_SCHEMA@@._QUADBIN_SIBLING(quadbin, 0, -1) - WHEN 'down' THEN - @@SF_SCHEMA@@._QUADBIN_SIBLING(quadbin, 0, 1) - ELSE - NULL - END + IFF(quadbin IS NULL OR direction IS NULL, + NULL, + CASE direction + WHEN 'left' THEN + @@SF_SCHEMA@@._QUADBIN_SIBLING(quadbin, -1, 0) + WHEN 'right' THEN + @@SF_SCHEMA@@._QUADBIN_SIBLING(quadbin, 1, 0) + WHEN 'up' THEN + @@SF_SCHEMA@@._QUADBIN_SIBLING(quadbin, 0, -1) + WHEN 'down' THEN + @@SF_SCHEMA@@._QUADBIN_SIBLING(quadbin, 0, 1) + ELSE + NULL + END + ) $$; diff --git a/clouds/snowflake/modules/sql/quadbin/QUADBIN_TOPARENT.sql b/clouds/snowflake/modules/sql/quadbin/QUADBIN_TOPARENT.sql index 322e1ef33..d75a9b600 100644 --- a/clouds/snowflake/modules/sql/quadbin/QUADBIN_TOPARENT.sql +++ b/clouds/snowflake/modules/sql/quadbin/QUADBIN_TOPARENT.sql @@ -1,25 +1,30 @@ ----------------------------- --- Copyright (C) 2022 CARTO ----------------------------- +-------------------------------- +-- Copyright (C) 2022-2023 CARTO +-------------------------------- CREATE OR REPLACE SECURE FUNCTION @@SF_SCHEMA@@.QUADBIN_TOPARENT (quadbin BIGINT, resolution INT) RETURNS BIGINT IMMUTABLE AS $$ - SELECT bitor( - bitor( - bitand( - quadbin, - bitnot( - bitshiftleft(31, 52) - ) + IFF(quadbin IS NULL OR resolution IS NULL OR resolution < 0 OR resolution > 26, + NULL, + ( + SELECT bitor( + bitor( + bitand( + quadbin, + bitnot( + bitshiftleft(31, 52) + ) + ), + bitshiftleft(resolution, 52) ), - bitshiftleft(resolution, 52) - ), - bitshiftright( - 4503599627370495, - resolution * 2 + bitshiftright( + 4503599627370495, + resolution * 2 + ) ) - ) + ) + ) $$; diff --git a/clouds/snowflake/modules/sql/quadbin/QUADBIN_TOQUADKEY.sql b/clouds/snowflake/modules/sql/quadbin/QUADBIN_TOQUADKEY.sql index d418ae0d4..af62d8a6f 100644 --- a/clouds/snowflake/modules/sql/quadbin/QUADBIN_TOQUADKEY.sql +++ b/clouds/snowflake/modules/sql/quadbin/QUADBIN_TOQUADKEY.sql @@ -1,6 +1,6 @@ ----------------------------- --- Copyright (C) 2022 CARTO ----------------------------- +-------------------------------- +-- Copyright (C) 2022-2023 CARTO +-------------------------------- CREATE OR REPLACE FUNCTION @@SF_SCHEMA@@._QUADBIN_TOQUADKEY (quadbin STRING) @@ -20,5 +20,8 @@ CREATE OR REPLACE FUNCTION @@SF_SCHEMA@@.QUADBIN_TOQUADKEY RETURNS STRING IMMUTABLE AS $$ - SELECT @@SF_SCHEMA@@._QUADBIN_TOQUADKEY(CAST(QUADBIN AS STRING)) + IFF(quadbin IS NULL, + NULL, + @@SF_SCHEMA@@._QUADBIN_TOQUADKEY(CAST(QUADBIN AS STRING)) + ) $$; diff --git a/clouds/snowflake/modules/sql/quadbin/QUADBIN_TOZXY.sql b/clouds/snowflake/modules/sql/quadbin/QUADBIN_TOZXY.sql index 6b7d0462c..d46b2e6c1 100644 --- a/clouds/snowflake/modules/sql/quadbin/QUADBIN_TOZXY.sql +++ b/clouds/snowflake/modules/sql/quadbin/QUADBIN_TOZXY.sql @@ -1,6 +1,6 @@ ----------------------------- --- Copyright (C) 2022 CARTO ----------------------------- +-------------------------------- +-- Copyright (C) 2022-2023 CARTO +-------------------------------- CREATE OR REPLACE SECURE FUNCTION @@SF_SCHEMA@@.QUADBIN_TOZXY @@ -8,5 +8,8 @@ CREATE OR REPLACE SECURE FUNCTION @@SF_SCHEMA@@.QUADBIN_TOZXY RETURNS OBJECT IMMUTABLE AS $$ - @@SF_SCHEMA@@._QUADBIN_TOZXY(TO_VARCHAR(QUADBIN, 'xxxxxxxxxxxxxxxx')) + IFF(quadbin IS NULL, + NULL, + @@SF_SCHEMA@@._QUADBIN_TOZXY(TO_VARCHAR(QUADBIN, 'xxxxxxxxxxxxxxxx')) + ) $$;