Personnalisation des procédures stockées et des gestionnaires (handlers)

Snowflake Native SDK for Connectors fournit la structure générale du connecteur, et permet certaines personnalisations, en fonction du système source et des besoins réels du développeur. C’est pourquoi certaines fonctions ont des implémentations de base vides et il est possible de les remplacer par une logique personnalisée. En outre, les composants peuvent être activés et désactivés en fonction de besoins spécifiques, pour en savoir plus, reportez-vous à la section « Choix des composants ».

Procédures stockées

Les procédures stockées fournies par le SDK peuvent être divisées en deux catégories :

  1. Points d’entrée de haut niveau vers la logique mise en œuvre en Java

  2. Procédures internes de portée plus limitée

Parce qu’ils ont des responsabilités différentes, le processus de personnalisation est également différent.

Personnalisation des procédures à un niveau élevé

Les procédures de haut niveau ne sont utilisées que comme point d’entrée dans la logique réelle mise en œuvre en Java. Ainsi, pour modifier la logique sous-jacente, un chemin vers le nouveau gestionnaire (handler) doit être spécifié lors de la recréation de la procédure stockée. Cette procédure doit être ajoutée en tant que code personnalisé dans le script setup.sql. Pour ce faire, il faut fournir la nouvelle implémentation Java, qui peut être réalisée à partir de zéro ou en utilisant les fournisseurs du SDK builders, qui sont décrits ci-dessous :

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

Personnalisation des procédures de portée réduite

Certaines des procédures fournies par le Snowflake Native SDK for Connectors ont si peu de logique qu’elles peuvent être facilement rédigées en utilisant uniquement SQL. Pour ces procédures, il est possible de remplacer les implémentations par défaut en utilisant uniquement SQL. Par exemple, certaines procédures avec les suffixes _VALIDATE ou _INTERNAL peuvent être réimplémentées de cette manière. Toutes ces procédures peuvent également être personnalisées en utilisant l’approche Java uniquement via Builders. Cette approche est expliquée ci-dessous. Il est également possible de remplacer une procédure qui n’utilisait que SQL par un gestionnaire (handler). Dans ce cas, elle sera la même que pour les procédures stockées de haut niveau ci-dessus.

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

Gestionnaires (handlers)

Snowflake Native SDK for Connectors définit des gestionnaires (handlers) par défaut pour les procédures stockées. Ils peuvent être utilisés tels quels, personnalisés ou complètement remplacés. Dans ce dernier cas, l’ensemble de la mise en œuvre personnalisée ne doit pas nécessairement suivre les normes définies par le SDK et la mise en œuvre personnalisée doit être spécifiée en SQL comme cela a été mentionné ci-dessus pour la personnalisation des procédures de haut niveau.

Toutefois, si vous souhaitez suivre le flux du connecteur défini par le SDK, il est possible de ne personnaliser que certaines parties du flux. Chaque gestionnaire (handler) existant utilise plusieurs objets sous-jacents, dans la plupart des cas il s’agit des classes : validator, callback ou helper. Chacun d’entre elles satisfait à une certaine interface et il est possible de remplacer les implémentations par défaut par des implémentations personnalisées de l’interface.

Constructeurs

Pour conserver le flux défini par SDKdans le connecteur lors de la personnalisation, des objets de helper appelés builders sont fournis. Chaque classe de handler a son propre builder regroupé. Ceux-ci permettent à l’utilisateur de fournir une implémentation personnalisée des objets Java sous-jacents. Ainsi, le développeur n’a pas besoin de toucher au flux interne du connecteur et peut se concentrer sur la personnalisation des parties nécessaires. Il y a un petit problème lorsque vous utilisez builders, cette approche nécessite également que le développeur spécifie la nouvelle méthode de point d’entrée qui sera référencée dans la procédure stockée.

Par exemple, un handler utilisant un validator personnalisé utilisant le builder ressemble à ceci :

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

La méthode du point d’entrée dans SQL doit alors être spécifiée comme suit :

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