ストアドプロシージャとハンドラーのカスタマイズ

Snowflake Native SDK for Connectors はコネクタの一般的な構造を提供しますが、ソースシステムと開発者の実際のニーズに応じて、ある程度のカスタマイズが可能です。そのため、一部の機能には空の基本実装があり、カスタムロジックで上書きできます。さらに、コンポーネントは特定のニーズに応じて有効または無効にできます。詳細については、コンポーネントの選択セクションをご参照ください。

ストアドプロシージャ

SDK によって提供されるストアドプロシージャは、次の2つのカテゴリに分けられます。

  1. Javaで実装されたロジックへの高レベルのエントリポイント

  2. 小規模の内部プロシージャ

それぞれの担当業務が異なるため、カスタマイズのプロセスも異なります。

高レベルのプロシージャのカスタマイズ

高レベルのプロシージャは、Javaで実装された実際のロジックへのエントリポイントとしてのみ使用されます。したがって、基礎となるロジックを変更するには、ストアドプロシージャを再作成するときに、新しいハンドラーへのパスを指定する必要があります。このプロシージャは、 setup.sql スクリプトにカスタムコードとして追加する必要があります。これには新しいJava実装を提供する必要があります。これは最初から行うことも、以下で説明する SDK builders で提供されているものを使用することもできます。

CREATE OR REPLACE PROCEDURE PUBLIC.CONFIGURE_CONNECTOR(input VARIANT)
    RETURNS VARIANT
    LANGUAGE JAVA
    RUNTIME_VERSION = '11'
    PACKAGES = ('com.snowflake:snowpark:1.11.0')
    IMPORTS = ('/jar_with_custom_code.jar')
    HANDLER = 'com.custom.handler.CustomHandler.configure';
Copy

小規模なプロシージャのカスタマイズ

Snowflake Native SDK for Connectors によって提供されるプロシージャの中には、ロジックが非常に少ないものがあり、 SQL のみを使用して簡単に記述できます。これらのプロシージャでは、 SQL のみを使用してデフォルトの実装を置き換えることができます。たとえば、 _VALIDATE または _INTERNAL サフィックスを持つ一部のプロシージャは、この方法で再実装できます。これらのプロシージャはすべて、 Builders を通じてJavaのみのアプローチを使用してカスタマイズすることもできます。このアプローチについては、以下で説明します。プレーン SQL のみを使用していたプロシージャを、代わりにハンドラーを使用するように置き換えることもできます。この場合は、上記の高レベルのストアドプロシージャと同じになります。

CREATE OR REPLACE PROCEDURE PUBLIC.CONFIGURE_CONNECTOR_INTERNAL(config VARIANT)
    RETURNS VARIANT
    LANGUAGE SQL
    EXECUTE AS OWNER
    AS
    BEGIN
        -- input some custom logic here
        RETURN OBJECT_CONSTRUCT('response_code', 'OK');
    END;
Copy

ハンドラー

Snowflake Native SDK for Connectors はストアドプロシージャのデフォルトハンドラーを定義します。そのまま使用することも、カスタマイズまたは完全に置き換えることもできます。後者の場合、カスタム実装全体が SDK で定義された標準に従う必要はなく、高レベルの手順をカスタマイズするために上で述べたように、カスタム実装は SQL で指定する必要があります。

ただし、 SDK で定義されたコネクタのフローに従う場合は、フローの一部だけをカスタマイズする方法があります。既存の各ハンドラーは複数の基礎オブジェクトを使用しており、ほとんどの場合、それらは validatorcallback、または helper クラスです。それぞれが何らかのインターフェイスを満たしており、デフォルトの実装をインターフェイスのカスタム実装に置き換えることができます。

ビルダー

カスタマイズ中にコネクタ内の SDK 定義フローを保持するために、 builders と呼ばれるヘルパーオブジェクトが提供されます。各 handler クラスには独自の builder バンドルがあります。これらにより、ユーザーは基盤となるJavaオブジェクトのカスタム実装を提供できるようになります。この方法では、開発者はコネクタの内部フローに触れる必要がなくなり、必要な部分のみのカスタマイズに集中できます。 builders を使用する場合、小さな問題があります。このアプローチでは、開発者がストアドプロシージャで参照される新しいエントリポイントメソッドを指定する必要もあります。

たとえば、 handler を使用してカスタマイズされた validator を使用する builder は次のようになります。

class CustomConnectionConfigurationInputValidator implements ConnectionConfigurationInputValidator {
    @Override
    public ConnectorResponse validate(Variant config) {
        // CUSTOM LOGIC
        return ConnectorResponse.success();
    }
}

class CustomHandler {

    // Path to this method needs to be specified in the PUBLIC.SET_CONNECTION_CONFIGURATION procedure using SQL
    public static Variant configureConnection(Session session, Variant configuration) {
            //Using builder
        var handler = ConnectionConfigurationHandler.builder(session)
            .withInputValidator(new CustomConnectionConfigurationInputValidator())
            .build();
        return handler.connectionConfiguration(configuration).toVariant();
    }
}
Copy

その場合、 SQL のエントリポイントメソッドを次のように指定する必要があります。

CREATE OR REPLACE PROCEDURE PUBLIC.SET_CONNECTION_CONFIGURATION(input VARIANT)
    RETURNS VARIANT
    LANGUAGE JAVA
    RUNTIME_VERSION = '11'
    PACKAGES = ('com.snowflake:snowpark:1.11.0')
    IMPORTS = ('/jar_with_custom_code.jar')
    HANDLER = 'com.custom.handler.CustomHandler.configureConnection';
Copy