class SQLProxyConfigurationBuilder<K> {
    ClientSideConfig clientSideConfig;
    BucketTableSettings tableSettings;
    PrimaryKeyMapper<K> primaryKeyMapper;

    SQLProxyConfigurationBuilder(PrimaryKeyMapper<K> primaryKeyMapper) {
        this.primaryKeyMapper = primaryKeyMapper;
        this.tableSettings = BucketTableSettings.getDefault();
        this.clientSideConfig = ClientSideConfig.getDefault();
    }

    /**
     * @deprecated use {@link SQLProxyConfiguration#builder()}
     *
     * @return the new instance of {@link SQLProxyConfigurationBuilder} configured with {@link PrimaryKeyMapper#LONG} primary key mapper
     */
    public static SQLProxyConfigurationBuilder<Long> builder() {
        return new SQLProxyConfigurationBuilder<>(PrimaryKeyMapper.LONG);
    }

    /**
     * @param clientSideConfig {@link ClientSideConfig} client-side configuration for proxy-manager.
     *                         By default, under the hood uses {@link ClientSideConfig#getDefault}
     * @return {@link SQLProxyConfigurationBuilder}
     */
    public SQLProxyConfigurationBuilder<K> withClientSideConfig(ClientSideConfig clientSideConfig) {
        this.clientSideConfig = Objects.requireNonNull(clientSideConfig);
        return this;
    }

    /**
     * @param tableSettings {@link BucketTableSettings} define a configuration of the table to use as a Buckets store.
     *                      By default, under the hood uses {@link BucketTableSettings#getDefault}
     * @return {@link SQLProxyConfigurationBuilder}
     */
    public SQLProxyConfigurationBuilder<K> withTableSettings(BucketTableSettings tableSettings) {
        this.tableSettings = Objects.requireNonNull(tableSettings);
        return this;
    }

    /**
     * @param primaryKeyMapper Specifies the type of primary key.
     *                         By default, under the hood uses {@link PrimaryKeyMapper#LONG}
     * @return {@link SQLProxyConfigurationBuilder}
     */
    public <T> SQLProxyConfigurationBuilder<T> withPrimaryKeyMapper(PrimaryKeyMapper<T> primaryKeyMapper) {
        this.primaryKeyMapper = (PrimaryKeyMapper<K>) Objects.requireNonNull(primaryKeyMapper);
        return (SQLProxyConfigurationBuilder<T>) this;
    }

    /**
     * The method takes a {@link DataSource} as a required parameter
     *
     * @param dataSource - a database configuration
     * @return {@link SQLProxyConfiguration}
     */
    public SQLProxyConfiguration<K> build(DataSource dataSource) {<FILL_FUNCTION_BODY>}
}

        if (dataSource == null) {
            throw new BucketExceptions.BucketExecutionException("DataSource cannot be null");
        }
        return new SQLProxyConfiguration<>(this, dataSource);
    
<no_super_class>