created: 2022-09-11T01:22:41.171Z

GoogleCloudPlatform/bigquery-utils にパッチを送る

こちらのリポジトリ。

fork/clone

たぶんやり方が色々あるはずだが、元のリポジトリを fork して、自分のリポジトリをローカルに clone して作業をした。

自分のローカルのリポジトリが古くなっていたら fetch しておく。

$ git remote add upstream ssh://git@github.com/GoogleCloudPlatform/bigquery-utils.git
$ git fetch upstream

変更

自分の GCP プロジェクトでぽいぽいクエリを発行しながら動作確認をしつつ実装する。

こんなSQLを使って動作確認する。

DECLARE s STRING;
SET
  s = "http://facebook.com/~tilde/hy-phen/do.t/under_score.php?k1=v1&k2=v2#Ref1";
CREATE TEMP FUNCTION url_parse(url STRING, part STRING)
AS (
  CASE
    WHEN UPPER(part) = 'HOST'  THEN REGEXP_EXTRACT(url, r'(?:[a-zA-Z]+://)?([a-zA-Z0-9-.]+)/?')
    WHEN UPPER(part) = 'PATH2'  THEN REGEXP_EXTRACT(url, r'(?:[a-zA-Z]+://)?(?:[a-zA-Z0-9-.]+)/{1}([a-zA-Z0-9-.~_/]+)')
    WHEN UPPER(part) = 'PATH'  THEN REGEXP_EXTRACT(url, r'(?:[a-zA-Z]+://)?(?:[a-zA-Z0-9-.]+)/{1}([a-zA-Z0-9-./]+)')
    WHEN UPPER(part) = 'QUERY' THEN REGEXP_EXTRACT(url, r'\?(.*)')
    WHEN UPPER(part) = 'REF'   THEN REGEXP_EXTRACT(url, r'#(.*)')
    WHEN UPPER(part) = 'PROTOCOL' THEN REGEXP_EXTRACT(url, r'^([a-zA-Z]+)://')
    ELSE NULL
  END
);
SELECT 
  url_parse(s, "PATH"),
  url_parse(s, "PATH2");

テスト

こちらに書いてある通りにすればテストが CloudBuild 上で(ちょっと時間がかかるが)動かせる。GCSのバケットかディレクトリを用意する必要があるのでそこが手間なだけだった。

試しに落ちるテストを書いてみたらちゃんと落ちる。

$ bash run_unit_tests.sh

...(中略)...

Step #5 - "test_udfs": url_parse_86335eeb-0000-4f36-9c96-9bc725533d74: failed
Step #5 - "test_udfs":   For row 4 and column "udf_output": expected "~tilde/hy-phen/do.t/under_score.php", but saw "hy-phen/do.t/under".

...(中略)...

Step #5 - "test_udfs": nautical_miles_conversion_21eb5c5b-0000-4c3d-8eb4-1dbab604713a: passed
Step #5 - "test_udfs": azimuth_to_geog_point_d14eb053-1718-0000-b5cf-7267a42b4ea7: passed
Step #5 - "test_udfs": FAILURE: Encountered an error when running UDF tests for dataset: fn_test_env
Step #5 - "test_udfs":
Finished Step #5 - "test_udfs"
ERROR
ERROR: build step 5 "gcr.io/bqutil/bq_udf_ci" failed: step exited with non-zero status: 1
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

BUILD FAILURE: Build step failure: build step 5 "gcr.io/bqutil/bq_udf_ci" failed: step exited with non-zero status: 1
ERROR: (gcloud.builds.submit) build c928c2a8-0000-4076-b337-4893e10e5ead completed with status "FAILURE"

CLA?

Google のオープンソースプロジェクトにコントリビュートする際には規約に同意する必要がある。(同意していないとCIがコケるようになっている)

↓のページからフォームで GitHub アカウントなどを入れてサブミットしておく。

参考