Skip to content

Commit c332ec0

Browse files
authored
Merge pull request #996 from MolSSI/rel_64
Release v0.64
2 parents 3b15834 + 07bea7c commit c332ec0

File tree

10 files changed

+161
-14
lines changed

10 files changed

+161
-14
lines changed

docs/source/release_notes.rst

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,36 @@
11
Release Notes
22
=============
33

4+
0.64 / 2026-03-04
5+
-----------------
6+
7+
Some cleanup and some small bug fixes. Some old code and migrations were removed and some
8+
incorrect endpoints were fixed.
9+
10+
One bigger change is the improved use of upserts (ON CONFLICT DO NOTHING) in postgres, particularly
11+
for the molecule table but also on specification tables. This should eliminate some deadlocks
12+
that were happening due to the use of advisory locks.
13+
14+
Some bugs found during the development of the web app were fixed. These related to the "/me" endpoint which
15+
is not used by the PortalClient, but will be used by the web app. Also, we improved the performance
16+
of dataset listing, which was getting slow on our large instances.
17+
18+
This release also introduces pydantic v2 in a few isolated areas (configuration files), with more
19+
coming the next version.
20+
21+
Notable PRs:
22+
23+
- (:pr:`977`) Adding & cleaning documentation
24+
- (:pr:`978`) Update server and compute config to use pydantic v2
25+
- (:pr:`980`) Remove pre-v0.50 database migrations
26+
- (:pr:`985`) Making dataset views should always include required record fields
27+
- (:pr:`988`) Improve errors for exporting to qcschema with missing data
28+
- (:pr:`991`, :pr:`992`) Fix /me endpoints and add tests
29+
- (:pr:`993`) Add owner/user to project listing
30+
- (:pr:`994`) Rework database locking to use upserts when possible
31+
- (:pr:`995`) Faster record count in dataset list
32+
33+
434
0.63 / 2025-09-26
535
-----------------
636

qcarchivetesting/conda-envs/fulltest_server.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ dependencies:
1616
- pydantic-settings
1717
- zstandard
1818
- apsw>=3.42
19-
- qcelemental<0.70a0
19+
- qcelemental>=0.30,<0.70a0
2020
- tabulate
2121
- tqdm
2222
- pandas

qcarchivetesting/conda-envs/fulltest_snowflake.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ dependencies:
1616
- pydantic-settings
1717
- zstandard
1818
- apsw>=3.42
19-
- qcelemental<0.70a0
19+
- qcelemental>=0.30,<0.70a0
2020
- tabulate
2121
- tqdm
2222
- pandas
@@ -47,7 +47,7 @@ dependencies:
4747
- scipy # TODO Required for geometric REMOVE EVENTUALLY
4848

4949
# Worker codes below
50-
- qcengine<0.70a0
50+
- qcengine>=0.34,<0.70a0
5151
- psi4>=1.9.1
5252
- rdkit
5353

qcarchivetesting/conda-envs/fulltest_testing.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ dependencies:
1616
- pydantic-settings
1717
- zstandard
1818
- apsw>=3.42
19-
- qcelemental<0.70a0
19+
- qcelemental>=0.30,<0.70a0
2020
- tabulate
2121
- tqdm
2222
- pandas

qcarchivetesting/conda-envs/fulltest_worker.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ dependencies:
1414
- pydantic-settings
1515
- zstandard
1616
- apsw>=3.42
17-
- qcelemental<0.70a0
17+
- qcelemental>=0.30,<0.70a0
1818
- tabulate
1919
- tqdm
2020
- pandas
@@ -28,7 +28,7 @@ dependencies:
2828
- parsl
2929

3030
# Worker codes below
31-
- qcengine<0.70a0
31+
- qcengine>=0.34,<0.70a0
3232
- psi4>=1.9.1
3333
- rdkit
3434
- geometric

qcarchivetesting/pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ description = "A distributed compute and database platform for quantum chemistry
1313
readme = "README.md"
1414
license = "BSD-3-Clause"
1515
license-files = ["LICENSE"]
16-
requires-python = ">=3.10"
16+
requires-python = ">=3.10,<3.14"
1717
classifiers = [
1818
"Programming Language :: Python :: 3",
1919
"Development Status :: 4 - Beta",
@@ -23,7 +23,7 @@ classifiers = [
2323
]
2424
dependencies = [
2525
"qcfractal",
26-
"qcengine<0.70a0",
26+
"qcengine>=0.34,<0.70a0",
2727
"pytest",
2828
"deepdiff",
2929
]

qcfractal/pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ description = "A distributed compute and database platform for quantum chemistry
1313
readme = "README.md"
1414
license = "BSD-3-Clause"
1515
license-files = ["LICENSE"]
16-
requires-python = ">=3.10"
16+
requires-python = ">=3.10,<3.14"
1717
classifiers = [
1818
"Programming Language :: Python :: 3",
1919
"Development Status :: 4 - Beta",

qcfractal/qcfractal/alembic/versions/2026-02-27-83127ad1a00e_add_postgres_nulls_not_distinct_to_specs.py

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
77
"""
88

9+
import sqlalchemy as sa
910
from alembic import op
1011

1112
# revision identifiers, used by Alembic.
@@ -19,6 +20,122 @@ def upgrade():
1920
op.drop_constraint("ux_neb_specification_keys", "neb_specification", type_="unique")
2021
op.drop_constraint("ux_reaction_specification_keys", "reaction_specification", type_="unique")
2122

23+
# We need to find duplicates due to a NULL optimization_specification_id
24+
# then update references and delete
25+
op.execute(sa.text("""
26+
WITH ranked AS (
27+
SELECT
28+
id,
29+
MIN(id) OVER (
30+
PARTITION BY specification_hash, singlepoint_specification_id
31+
) AS canonical_id
32+
FROM neb_specification
33+
WHERE optimization_specification_id IS NULL
34+
),
35+
dupes AS (
36+
SELECT id AS duplicate_id, canonical_id
37+
FROM ranked
38+
WHERE id <> canonical_id
39+
)
40+
UPDATE neb_record r
41+
SET specification_id = d.canonical_id
42+
FROM dupes d
43+
WHERE r.specification_id = d.duplicate_id;
44+
"""))
45+
46+
op.execute(sa.text("""
47+
WITH ranked AS (
48+
SELECT
49+
id,
50+
MIN(id) OVER (
51+
PARTITION BY specification_hash, singlepoint_specification_id
52+
) AS canonical_id
53+
FROM neb_specification
54+
WHERE optimization_specification_id IS NULL
55+
),
56+
dupes AS (
57+
SELECT id AS duplicate_id, canonical_id
58+
FROM ranked
59+
WHERE id <> canonical_id
60+
)
61+
UPDATE neb_dataset_specification rds
62+
SET specification_id = d.canonical_id
63+
FROM dupes d
64+
WHERE rds.specification_id = d.duplicate_id;
65+
"""))
66+
67+
op.execute(sa.text("""
68+
WITH ranked AS (
69+
SELECT
70+
id,
71+
MIN(id) OVER (
72+
PARTITION BY specification_hash, singlepoint_specification_id
73+
) AS canonical_id
74+
FROM neb_specification
75+
WHERE optimization_specification_id IS NULL
76+
)
77+
DELETE FROM neb_specification r
78+
USING ranked d
79+
WHERE r.id = d.id
80+
AND d.id <> d.canonical_id;
81+
"""))
82+
83+
# Now for reactions, which can have singlepoint or optimization specification ids be null
84+
op.execute(sa.text("""
85+
WITH ranked AS (
86+
SELECT
87+
id,
88+
MIN(id) OVER (
89+
PARTITION BY specification_hash, singlepoint_specification_id, optimization_specification_id
90+
) AS canonical_id
91+
FROM reaction_specification
92+
),
93+
dupes AS (
94+
SELECT id AS duplicate_id, canonical_id
95+
FROM ranked
96+
WHERE id <> canonical_id
97+
)
98+
UPDATE reaction_record r
99+
SET specification_id = d.canonical_id
100+
FROM dupes d
101+
WHERE r.specification_id = d.duplicate_id;
102+
"""))
103+
104+
op.execute(sa.text("""
105+
WITH ranked AS (
106+
SELECT
107+
id,
108+
MIN(id) OVER (
109+
PARTITION BY specification_hash, singlepoint_specification_id, optimization_specification_id
110+
) AS canonical_id
111+
FROM reaction_specification
112+
),
113+
dupes AS (
114+
SELECT id AS duplicate_id, canonical_id
115+
FROM ranked
116+
WHERE id <> canonical_id
117+
)
118+
UPDATE reaction_dataset_specification rds
119+
SET specification_id = d.canonical_id
120+
FROM dupes d
121+
WHERE rds.specification_id = d.duplicate_id;
122+
"""))
123+
124+
op.execute(sa.text("""
125+
WITH ranked AS (
126+
SELECT
127+
id,
128+
MIN(id) OVER (
129+
PARTITION BY specification_hash, singlepoint_specification_id, optimization_specification_id
130+
) AS canonical_id
131+
FROM reaction_specification
132+
)
133+
DELETE FROM reaction_specification r
134+
USING ranked d
135+
WHERE r.id = d.id
136+
AND d.id <> d.canonical_id;
137+
"""))
138+
22139
op.create_unique_constraint(
23140
"ux_neb_specification_keys",
24141
"neb_specification",

qcfractalcompute/pyproject.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ description = "A distributed compute and database platform for quantum chemistry
1313
readme = "README.md"
1414
license = "BSD-3-Clause"
1515
license-files = ["LICENSE"]
16-
requires-python = ">=3.10"
16+
requires-python = ">=3.10,<3.14"
1717
classifiers = [
1818
"Programming Language :: Python :: 3",
1919
"Development Status :: 4 - Beta",
@@ -24,6 +24,7 @@ classifiers = [
2424
dependencies = [
2525
"qcportal",
2626
"parsl",
27+
"qcengine>=0.34,<0.70a0",
2728
]
2829

2930

qcportal/pyproject.toml

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ description = "A distributed compute and database platform for quantum chemistry
1313
readme = "README.md"
1414
license = "BSD-3-Clause"
1515
license-files = ["LICENSE"]
16-
requires-python = ">=3.10"
16+
requires-python = ">=3.10,<3.14"
1717
classifiers = [
1818
"Programming Language :: Python :: 3",
1919
"Development Status :: 4 - Beta",
@@ -26,12 +26,11 @@ dependencies = [
2626
"msgpack",
2727
"requests",
2828
"pyyaml",
29-
"pydantic>2.10",
29+
"pydantic>=2.11",
3030
"pydantic-settings",
3131
"zstandard",
3232
"apsw>=3.42",
33-
"qcelemental<0.70a0",
34-
"pint", # Required for qcelemental. Doesn't install with py3.13. REMOVE EVENTUALLY
33+
"qcelemental>=0.30,<0.70a0",
3534
"tabulate",
3635
"tqdm",
3736
"pandas",

0 commit comments

Comments
 (0)