Skip to content

Commit

Permalink
Update JDBC & MongoDB packages to latest versions
Browse files Browse the repository at this point in the history
  • Loading branch information
dolfinus committed Aug 29, 2024
1 parent 7e70db1 commit 82685e9
Show file tree
Hide file tree
Showing 15 changed files with 77 additions and 69 deletions.
8 changes: 8 additions & 0 deletions docs/changelog/0.12.0.rst
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,14 @@ Breaking Changes
* ``smb://host:port`` -> ``smb://host:port/share``
* ``s3://host:port`` -> ``s3://host:port/bucket`` (:github:pull:`304`)

- Update DB connectors/drivers to latest versions:
* Clickhouse ``0.6.0-patch5`` → ``0.6.4``
* MongoDB ``10.3.0`` → ``10.4.0``
* MSSQL ``12.6.2`` → ``12.8.1``
* MySQL ``8.4.0`` → ``9.0.0``
* Oracle ``23.4.0.24.05`` → ``23.5.0.24.07``
* Postgres ``42.7.3`` → ``42.7.4``

- Update ``Excel`` package from ``0.20.3`` to ``0.20.4``, to include Spark 3.5.1 support. (:github:pull:`306`)

Features
Expand Down
4 changes: 2 additions & 2 deletions docs/connection/db_connection/mongodb/types.rst
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,8 @@ References

Here you can find source code with type conversions:

* `MongoDB -> Spark <https://github.com/mongodb/mongo-spark/blob/r10.3.0/src/main/java/com/mongodb/spark/sql/connector/schema/InferSchema.java#L154-L200>`_
* `Spark -> MongoDB <https://github.com/mongodb/mongo-spark/blob/r10.3.0/src/main/java/com/mongodb/spark/sql/connector/schema/RowToBsonDocumentConverter.java#L157-L260>`_
* `MongoDB -> Spark <https://github.com/mongodb/mongo-spark/blob/r10.4.0/src/main/java/com/mongodb/spark/sql/connector/schema/InferSchema.java#L214-L260>`_
* `Spark -> MongoDB <https://github.com/mongodb/mongo-spark/blob/r10.4.0/src/main/java/com/mongodb/spark/sql/connector/schema/RowToBsonDocumentConverter.java#L157-L260>`_

Supported types
---------------
Expand Down
8 changes: 4 additions & 4 deletions onetl/connection/db_connection/clickhouse/connection.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ class Config:
class Clickhouse(JDBCConnection):
"""Clickhouse JDBC connection. |support_hooks|
Based on Maven package `com.clickhouse:clickhouse-jdbc:0.6.0-patch5 <https://mvnrepository.com/artifact/com.clickhouse/clickhouse-jdbc/0.6.0-patch5>`_
Based on Maven package `com.clickhouse:clickhouse-jdbc:0.6.4 <https://mvnrepository.com/artifact/com.clickhouse/clickhouse-jdbc/0.6.4>`_
(`official Clickhouse JDBC driver <https://github.com/ClickHouse/clickhouse-jdbc>`_).
.. seealso::
Expand Down Expand Up @@ -139,7 +139,7 @@ def get_packages(
Parameters
----------
package_version : str, optional
ClickHouse JDBC version client packages. Defaults to ``0.6.0-patch5``.
ClickHouse JDBC version client packages. Defaults to ``0.6.4``.
.. versionadded:: 0.11.0
Expand All @@ -158,7 +158,7 @@ def get_packages(
Clickhouse.get_packages(package_version="0.6.0", apache_http_client_version="5.3.1")
"""
default_jdbc_version = "0.6.0-patch5"
default_jdbc_version = "0.6.4"
default_http_version = "5.3.1"

jdbc_version = Version(package_version or default_jdbc_version).min_digits(3)
Expand All @@ -177,7 +177,7 @@ def get_packages(
@classproperty
def package(self) -> str:
"""Get a single string of package names to be downloaded by Spark for establishing a Clickhouse connection."""
return "com.clickhouse:clickhouse-jdbc:0.6.0-patch5,com.clickhouse:clickhouse-http-client:0.6.0-patch5,org.apache.httpcomponents.client5:httpclient5:5.3.1"
return "com.clickhouse:clickhouse-jdbc:0.6.4,com.clickhouse:clickhouse-http-client:0.6.4,org.apache.httpcomponents.client5:httpclient5:5.3.1"

@property
def jdbc_url(self) -> str:
Expand Down
14 changes: 7 additions & 7 deletions onetl/connection/db_connection/mongodb/connection.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ class Config:
class MongoDB(DBConnection):
"""MongoDB connection. |support_hooks|
Based on package `org.mongodb.spark:mongo-spark-connector:10.3.0 <https://mvnrepository.com/artifact/org.mongodb.spark/mongo-spark-connector_2.12/10.3.0>`_
Based on package `org.mongodb.spark:mongo-spark-connector:10.4.0 <https://mvnrepository.com/artifact/org.mongodb.spark/mongo-spark-connector_2.12/10.4.0>`_
(`MongoDB connector for Spark <https://www.mongodb.com/docs/spark-connector/current/>`_)
.. seealso::
Expand Down Expand Up @@ -153,7 +153,7 @@ def get_packages(
Spark version in format ``major.minor``. Used only if ``scala_version=None``.
package_version : str, optional
Specifies the version of the MongoDB Spark connector to use. Defaults to ``10.3.0``.
Specifies the version of the MongoDB Spark connector to use. Defaults to ``10.4.0``.
.. versionadded:: 0.11.0
Expand All @@ -166,10 +166,10 @@ def get_packages(
MongoDB.get_packages(scala_version="2.12")
# specify custom connector version
MongoDB.get_packages(scala_version="2.12", package_version="10.3.0")
MongoDB.get_packages(scala_version="2.12", package_version="10.4.0")
"""

default_package_version = "10.3.0"
default_package_version = "10.4.0"

if scala_version:
scala_ver = Version(scala_version).min_digits(2)
Expand All @@ -196,7 +196,7 @@ def package_spark_3_2(cls) -> str:
"use `MongoDB.get_packages(spark_version='3.2')` instead"
)
warnings.warn(msg, UserWarning, stacklevel=3)
return "org.mongodb.spark:mongo-spark-connector_2.12:10.3.0"
return "org.mongodb.spark:mongo-spark-connector_2.12:10.4.0"

@classproperty
def package_spark_3_3(cls) -> str:
Expand All @@ -206,7 +206,7 @@ def package_spark_3_3(cls) -> str:
"use `MongoDB.get_packages(spark_version='3.3')` instead"
)
warnings.warn(msg, UserWarning, stacklevel=3)
return "org.mongodb.spark:mongo-spark-connector_2.12:10.3.0"
return "org.mongodb.spark:mongo-spark-connector_2.12:10.4.0"

@classproperty
def package_spark_3_4(cls) -> str:
Expand All @@ -216,7 +216,7 @@ def package_spark_3_4(cls) -> str:
"use `MongoDB.get_packages(spark_version='3.4')` instead"
)
warnings.warn(msg, UserWarning, stacklevel=3)
return "org.mongodb.spark:mongo-spark-connector_2.12:10.3.0"
return "org.mongodb.spark:mongo-spark-connector_2.12:10.4.0"

@slot
def pipeline(
Expand Down
10 changes: 5 additions & 5 deletions onetl/connection/db_connection/mssql/connection.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ class Config:
class MSSQL(JDBCConnection):
"""MSSQL JDBC connection. |support_hooks|
Based on Maven package `com.microsoft.sqlserver:mssql-jdbc:12.6.2.jre8 <https://mvnrepository.com/artifact/com.microsoft.sqlserver/mssql-jdbc/12.6.2.jre8>`_
Based on Maven package `com.microsoft.sqlserver:mssql-jdbc:12.8.1.jre8 <https://mvnrepository.com/artifact/com.microsoft.sqlserver/mssql-jdbc/12.8.1.jre8>`_
(`official MSSQL JDBC driver
<https://docs.microsoft.com/en-us/sql/connect/jdbc/download-microsoft-jdbc-driver-for-sql-server>`_).
Expand Down Expand Up @@ -205,7 +205,7 @@ def get_packages(
java_version : str, optional
Java major version, defaults to ``8``. Must be ``8`` or ``11``.
package_version : str, optional
Specifies the version of the MSSQL JDBC driver to use. Defaults to ``12.6.2.``.
Specifies the version of the MSSQL JDBC driver to use. Defaults to ``12.8.1.``.
Examples
--------
Expand All @@ -216,10 +216,10 @@ def get_packages(
MSSQL.get_packages()
# specify Java and package versions
MSSQL.get_packages(java_version="8", package_version="12.6.2.jre11")
MSSQL.get_packages(java_version="8", package_version="12.8.1.jre11")
"""
default_java_version = "8"
default_package_version = "12.6.2"
default_package_version = "12.8.1"

java_ver = Version(java_version or default_java_version)
if java_ver.major < 8:
Expand All @@ -241,7 +241,7 @@ def package(cls) -> str:
"""Get package name to be downloaded by Spark."""
msg = "`MSSQL.package` will be removed in 1.0.0, use `MSSQL.get_packages()` instead"
warnings.warn(msg, UserWarning, stacklevel=3)
return "com.microsoft.sqlserver:mssql-jdbc:12.6.2.jre8"
return "com.microsoft.sqlserver:mssql-jdbc:12.8.1.jre8"

@property
def jdbc_url(self) -> str:
Expand Down
8 changes: 4 additions & 4 deletions onetl/connection/db_connection/mysql/connection.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ class Config:
class MySQL(JDBCConnection):
"""MySQL JDBC connection. |support_hooks|
Based on Maven package `com.mysql:mysql-connector-j:8.4.0 <https://mvnrepository.com/artifact/com.mysql/mysql-connector-j/8.4.0>`_
Based on Maven package `com.mysql:mysql-connector-j:9.0.0 <https://mvnrepository.com/artifact/com.mysql/mysql-connector-j/9.0.0>`_
(`official MySQL JDBC driver <https://dev.mysql.com/downloads/connector/j/8.4.html>`_).
.. seealso::
Expand Down Expand Up @@ -132,7 +132,7 @@ def get_packages(cls, package_version: str | None = None) -> list[str]:
Parameters
----------
package_version : str, optional
Specifies the version of the MySQL JDBC driver to use. Defaults to ``8.4.0``.
Specifies the version of the MySQL JDBC driver to use. Defaults to ``9.0.0``.
.. versionadded:: 0.11.0
Expand All @@ -147,7 +147,7 @@ def get_packages(cls, package_version: str | None = None) -> list[str]:
# specify a custom package version
MySQL.get_packages(package_version="8.2.0")
"""
default_version = "8.4.0"
default_version = "9.0.0"
version = Version(package_version or default_version).min_digits(3)

return [f"com.mysql:mysql-connector-j:{version}"]
Expand All @@ -157,7 +157,7 @@ def package(cls) -> str:
"""Get package name to be downloaded by Spark."""
msg = "`MySQL.package` will be removed in 1.0.0, use `MySQL.get_packages()` instead"
warnings.warn(msg, UserWarning, stacklevel=3)
return "com.mysql:mysql-connector-j:8.4.0"
return "com.mysql:mysql-connector-j:9.0.0"

@property
def jdbc_url(self) -> str:
Expand Down
10 changes: 5 additions & 5 deletions onetl/connection/db_connection/oracle/connection.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ class Config:
class Oracle(JDBCConnection):
"""Oracle JDBC connection. |support_hooks|
Based on Maven package `com.oracle.database.jdbc:ojdbc8:23.4.0.24.05 <https://mvnrepository.com/artifact/com.oracle.database.jdbc/ojdbc8/23.4.0.24.05>`_
Based on Maven package `com.oracle.database.jdbc:ojdbc8:23.5.0.24.07 <https://mvnrepository.com/artifact/com.oracle.database.jdbc/ojdbc8/23.5.0.24.07>`_
(`official Oracle JDBC driver <https://www.oracle.com/cis/database/technologies/appdev/jdbc-downloads.html>`_).
.. seealso::
Expand Down Expand Up @@ -208,7 +208,7 @@ def get_packages(
java_version : str, optional
Java major version, defaults to "8". Must be "8" or "11".
package_version : str, optional
Specifies the version of the Oracle JDBC driver to use. Defaults to "23.4.0.24.05".
Specifies the version of the Oracle JDBC driver to use. Defaults to "23.5.0.24.07".
Examples
--------
Expand All @@ -220,11 +220,11 @@ def get_packages(
Oracle.get_packages()
# specify Java and package versions
Oracle.get_packages(java_version="8", package_version="23.4.0.24.05")
Oracle.get_packages(java_version="8", package_version="23.5.0.24.07")
"""

default_java_version = "8"
default_package_version = "23.4.0.24.05"
default_package_version = "23.5.0.24.07"

java_ver = Version(java_version or default_java_version)
if java_ver.major < 8:
Expand All @@ -240,7 +240,7 @@ def package(cls) -> str:
"""Get package name to be downloaded by Spark."""
msg = "`Oracle.package` will be removed in 1.0.0, use `Oracle.get_packages()` instead"
warnings.warn(msg, UserWarning, stacklevel=3)
return "com.oracle.database.jdbc:ojdbc8:23.4.0.24.05"
return "com.oracle.database.jdbc:ojdbc8:23.5.0.24.07"

@property
def jdbc_url(self) -> str:
Expand Down
8 changes: 4 additions & 4 deletions onetl/connection/db_connection/postgres/connection.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ class Config:
class Postgres(JDBCConnection):
"""PostgreSQL JDBC connection. |support_hooks|
Based on Maven package `org.postgresql:postgresql:42.7.3 <https://mvnrepository.com/artifact/org.postgresql/postgresql/42.7.3>`_
Based on Maven package `org.postgresql:postgresql:42.7.4 <https://mvnrepository.com/artifact/org.postgresql/postgresql/42.7.4>`_
(`official Postgres JDBC driver <https://jdbc.postgresql.org/>`_).
.. seealso::
Expand Down Expand Up @@ -140,7 +140,7 @@ def get_packages(cls, package_version: str | None = None) -> list[str]:
Parameters
----------
package_version : str, optional
Specifies the version of the PostgreSQL JDBC driver to use. Defaults to ``42.7.3``.
Specifies the version of the PostgreSQL JDBC driver to use. Defaults to ``42.7.4``.
Examples
--------
Expand All @@ -155,7 +155,7 @@ def get_packages(cls, package_version: str | None = None) -> list[str]:
Postgres.get_packages(package_version="42.6.0")
"""
default_version = "42.7.3"
default_version = "42.7.4"
version = Version(package_version or default_version).min_digits(3)

return [f"org.postgresql:postgresql:{version}"]
Expand All @@ -165,7 +165,7 @@ def package(cls) -> str:
"""Get package name to be downloaded by Spark."""
msg = "`Postgres.package` will be removed in 1.0.0, use `Postgres.get_packages()` instead"
warnings.warn(msg, UserWarning, stacklevel=3)
return "org.postgresql:postgresql:42.7.3"
return "org.postgresql:postgresql:42.7.4"

@property
def jdbc_url(self) -> str:
Expand Down
2 changes: 1 addition & 1 deletion onetl/file/format/xml.py
Original file line number Diff line number Diff line change
Expand Up @@ -200,7 +200,7 @@ def get_packages( # noqa: WPS231
raise ValueError(f"Package version must be above 0.13, got {version}")
log.warning("Passed custom package version %r, it is not guaranteed to be supported", package_version)
else:
version = Version("0.18.0").min_digits(3)
version = Version("0.18.0")

spark_ver = Version(spark_version)
scala_ver = Version(scala_version).min_digits(2) if scala_version else get_default_scala_version(spark_ver)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ def test_clickhouse_driver():

def test_clickhouse_package():
expected_packages = (
"com.clickhouse:clickhouse-jdbc:0.6.0-patch5,com.clickhouse:clickhouse-http-client:0.6.0-patch5,"
"com.clickhouse:clickhouse-jdbc:0.6.4,com.clickhouse:clickhouse-http-client:0.6.4,"
"org.apache.httpcomponents.client5:httpclient5:5.3.1"
)
assert Clickhouse.package == expected_packages
Expand All @@ -24,8 +24,8 @@ def test_clickhouse_package():
None,
None,
[
"com.clickhouse:clickhouse-jdbc:0.6.0-patch5",
"com.clickhouse:clickhouse-http-client:0.6.0-patch5",
"com.clickhouse:clickhouse-jdbc:0.6.4",
"com.clickhouse:clickhouse-http-client:0.6.4",
"org.apache.httpcomponents.client5:httpclient5:5.3.1",
],
),
Expand Down
18 changes: 9 additions & 9 deletions tests/tests_unit/tests_db_connection_unit/test_mongodb_unit.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@
def test_mongodb_package():
warning_msg = re.escape("will be removed in 1.0.0, use `MongoDB.get_packages(spark_version=")
with pytest.warns(UserWarning, match=warning_msg):
assert MongoDB.package_spark_3_2 == "org.mongodb.spark:mongo-spark-connector_2.12:10.3.0"
assert MongoDB.package_spark_3_3 == "org.mongodb.spark:mongo-spark-connector_2.12:10.3.0"
assert MongoDB.package_spark_3_4 == "org.mongodb.spark:mongo-spark-connector_2.12:10.3.0"
assert MongoDB.package_spark_3_2 == "org.mongodb.spark:mongo-spark-connector_2.12:10.4.0"
assert MongoDB.package_spark_3_3 == "org.mongodb.spark:mongo-spark-connector_2.12:10.4.0"
assert MongoDB.package_spark_3_4 == "org.mongodb.spark:mongo-spark-connector_2.12:10.4.0"


def test_mongodb_get_packages_no_input():
Expand Down Expand Up @@ -50,16 +50,16 @@ def test_mongodb_get_packages_scala_version_not_supported(scala_version):
@pytest.mark.parametrize(
"spark_version, scala_version, package_version, package",
[
(None, "2.12", "10.3.0", "org.mongodb.spark:mongo-spark-connector_2.12:10.3.0"),
(None, "2.13", "10.3.0", "org.mongodb.spark:mongo-spark-connector_2.13:10.3.0"),
("3.2", None, "10.3.0", "org.mongodb.spark:mongo-spark-connector_2.12:10.3.0"),
("3.3", None, "10.3.0", "org.mongodb.spark:mongo-spark-connector_2.12:10.3.0"),
("3.4", None, "10.3.0", "org.mongodb.spark:mongo-spark-connector_2.12:10.3.0"),
(None, "2.12", "10.4.0", "org.mongodb.spark:mongo-spark-connector_2.12:10.4.0"),
(None, "2.13", "10.4.0", "org.mongodb.spark:mongo-spark-connector_2.13:10.4.0"),
("3.2", None, "10.4.0", "org.mongodb.spark:mongo-spark-connector_2.12:10.4.0"),
("3.3", None, "10.4.0", "org.mongodb.spark:mongo-spark-connector_2.12:10.4.0"),
("3.4", None, "10.4.0", "org.mongodb.spark:mongo-spark-connector_2.12:10.4.0"),
("3.2", "2.12", "10.1.1", "org.mongodb.spark:mongo-spark-connector_2.12:10.1.1"),
("3.4", "2.13", "10.1.1", "org.mongodb.spark:mongo-spark-connector_2.13:10.1.1"),
("3.2", "2.12", "10.2.1", "org.mongodb.spark:mongo-spark-connector_2.12:10.2.1"),
("3.2", "2.12", "10.2.0", "org.mongodb.spark:mongo-spark-connector_2.12:10.2.0"),
("3.2.4", "2.12.1", "10.3.0", "org.mongodb.spark:mongo-spark-connector_2.12:10.3.0"),
("3.2.4", "2.12.1", "10.4.0", "org.mongodb.spark:mongo-spark-connector_2.12:10.4.0"),
],
)
def test_mongodb_get_packages(spark_version, scala_version, package_version, package):
Expand Down
20 changes: 10 additions & 10 deletions tests/tests_unit/tests_db_connection_unit/test_mssql_unit.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,23 +14,23 @@ def test_mssql_class_attributes():
def test_mssql_package():
warning_msg = re.escape("will be removed in 1.0.0, use `MSSQL.get_packages()` instead")
with pytest.warns(UserWarning, match=warning_msg):
assert MSSQL.package == "com.microsoft.sqlserver:mssql-jdbc:12.6.2.jre8"
assert MSSQL.package == "com.microsoft.sqlserver:mssql-jdbc:12.8.1.jre8"


@pytest.mark.parametrize(
"java_version, package_version, expected_packages",
[
(None, None, ["com.microsoft.sqlserver:mssql-jdbc:12.6.2.jre8"]),
("8", None, ["com.microsoft.sqlserver:mssql-jdbc:12.6.2.jre8"]),
("9", None, ["com.microsoft.sqlserver:mssql-jdbc:12.6.2.jre8"]),
("11", None, ["com.microsoft.sqlserver:mssql-jdbc:12.6.2.jre11"]),
("20", None, ["com.microsoft.sqlserver:mssql-jdbc:12.6.2.jre11"]),
("8", "12.6.2.jre8", ["com.microsoft.sqlserver:mssql-jdbc:12.6.2.jre8"]),
("11", "12.6.2.jre11", ["com.microsoft.sqlserver:mssql-jdbc:12.6.2.jre11"]),
(None, None, ["com.microsoft.sqlserver:mssql-jdbc:12.8.1.jre8"]),
("8", None, ["com.microsoft.sqlserver:mssql-jdbc:12.8.1.jre8"]),
("9", None, ["com.microsoft.sqlserver:mssql-jdbc:12.8.1.jre8"]),
("11", None, ["com.microsoft.sqlserver:mssql-jdbc:12.8.1.jre11"]),
("20", None, ["com.microsoft.sqlserver:mssql-jdbc:12.8.1.jre11"]),
("8", "12.8.1.jre8", ["com.microsoft.sqlserver:mssql-jdbc:12.8.1.jre8"]),
("11", "12.8.1.jre11", ["com.microsoft.sqlserver:mssql-jdbc:12.8.1.jre11"]),
("11", "12.7.0.jre11-preview", ["com.microsoft.sqlserver:mssql-jdbc:12.7.0.jre11-preview"]),
("8", "12.7.0.jre8-preview", ["com.microsoft.sqlserver:mssql-jdbc:12.7.0.jre8-preview"]),
("8", "12.6.2", ["com.microsoft.sqlserver:mssql-jdbc:12.6.2.jre8"]),
("11", "12.6.2", ["com.microsoft.sqlserver:mssql-jdbc:12.6.2.jre11"]),
("8", "12.8.1", ["com.microsoft.sqlserver:mssql-jdbc:12.8.1.jre8"]),
("11", "12.8.1", ["com.microsoft.sqlserver:mssql-jdbc:12.8.1.jre11"]),
],
)
def test_mssql_get_packages(java_version, package_version, expected_packages):
Expand Down
6 changes: 3 additions & 3 deletions tests/tests_unit/tests_db_connection_unit/test_mysql_unit.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,14 @@ def test_mysql_class_attributes():
def test_mysql_package():
warning_msg = re.escape("will be removed in 1.0.0, use `MySQL.get_packages()` instead")
with pytest.warns(UserWarning, match=warning_msg):
assert MySQL.package == "com.mysql:mysql-connector-j:8.4.0"
assert MySQL.package == "com.mysql:mysql-connector-j:9.0.0"


@pytest.mark.parametrize(
"package_version, expected_packages",
[
(None, ["com.mysql:mysql-connector-j:8.4.0"]),
("8.4.0", ["com.mysql:mysql-connector-j:8.4.0"]),
(None, ["com.mysql:mysql-connector-j:9.0.0"]),
("9.0.0", ["com.mysql:mysql-connector-j:9.0.0"]),
("8.1.0", ["com.mysql:mysql-connector-j:8.1.0"]),
("8.0.33", ["com.mysql:mysql-connector-j:8.0.33"]),
],
Expand Down
Loading

0 comments on commit 82685e9

Please sign in to comment.