public static ClickHouseNode of(String uri, Map<?, ?> options) {
        URI normalizedUri = normalize(uri, null);

        Map<String, String> params = new LinkedHashMap<>();
        parseDatabase(normalizedUri.getPath(), params);

        ClickHouseUtils.extractParameters(normalizedUri.getRawQuery(), params);

        Set<String> tags = new LinkedHashSet<>();
        parseTags(normalizedUri.getRawFragment(), tags);

        if (options != null && !options.isEmpty()) {
            for (Entry<?, ?> entry : options.entrySet()) {
                if (entry.getKey() != null) {
                    if (entry.getValue() != null) {
                        params.put(entry.getKey().toString(), entry.getValue().toString());
                    } else {
                        params.remove(entry.getKey().toString());
                    }
                }
            }
        }

        String scheme = normalizedUri.getScheme();
        ClickHouseProtocol protocol = ClickHouseProtocol.fromUriScheme(scheme);
        int port = extract(scheme, normalizedUri.getPort(), protocol, params);
        if ((options == null || options.get(ClickHouseClientOption.SSL.getKey()) == null)
                && scheme.equalsIgnoreCase("https")) {
            params.put(ClickHouseClientOption.SSL.getKey(), "true");
        }
        ClickHouseCredentials credentials = extract(normalizedUri.getRawUserInfo(), params, null);

        return new ClickHouseNode(normalizedUri.getHost(), protocol, port, credentials, params, tags);
    }
Creates a node object using given URI. Same as
{@code of(uri, ClickHouseProtocol.ANY)}.

@param uri     non-empty URI
@param options default options
@return non-null node object
clickhouse-client/src/main/java/com/clickhouse/client/ClickHouseNode.java