From 0ad83040f41d1d7fefd44a7bf261f67a83e9eb30 Mon Sep 17 00:00:00 2001 From: Masato Onodera Date: Fri, 20 Dec 2024 15:20:31 -1000 Subject: [PATCH 1/5] Add "partner" information to the target database - Added: `partner_id` column in the `proposal` column - Added: `partner.partner_id` and `proposal.partner_id` are related. - Added: `partner` table - Added: `example/data/partner.csv` - Added: alembic update file - Removed: "keck", "gemini", and "uh" from `proposal_category` values --- ...d44_add_partner_column_in_the_proposal_.py | 41 +++++++++++++++++ docs/examples/obsproc.md | 18 +++++--- docs/schema/partner.md | 32 ++++++++++++++ docs/schema/proposal.md | 4 +- docs/schema/proposal_category.md | 9 ++-- examples/data/partner.csv | 5 +++ examples/data/proposal_category.csv | 3 -- src/targetdb/cli/cli_main.py | 1 + src/targetdb/models/__init__.py | 1 + src/targetdb/models/partner.py | 44 +++++++++++++++++++ src/targetdb/models/proposal.py | 29 ++++-------- 11 files changed, 151 insertions(+), 36 deletions(-) create mode 100644 alembic/pfsa-db01-gb/alembic/versions/20241220-145409_0b72e62efd44_add_partner_column_in_the_proposal_.py create mode 100644 docs/schema/partner.md create mode 100644 examples/data/partner.csv create mode 100644 src/targetdb/models/partner.py diff --git a/alembic/pfsa-db01-gb/alembic/versions/20241220-145409_0b72e62efd44_add_partner_column_in_the_proposal_.py b/alembic/pfsa-db01-gb/alembic/versions/20241220-145409_0b72e62efd44_add_partner_column_in_the_proposal_.py new file mode 100644 index 0000000..862fb74 --- /dev/null +++ b/alembic/pfsa-db01-gb/alembic/versions/20241220-145409_0b72e62efd44_add_partner_column_in_the_proposal_.py @@ -0,0 +1,41 @@ +"""add partner column in the proposal table and partner table + +Revision ID: 0b72e62efd44 +Revises: b68482e38606 +Create Date: 2024-12-20 14:54:09.851011 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '0b72e62efd44' +down_revision = 'b68482e38606' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('partner', + sa.Column('partner_id', sa.Integer(), autoincrement=False, nullable=False, comment='Unique identifier of the partner'), + sa.Column('partner_name', sa.String(), nullable=False, comment='Name of the partner (e.g., subaru, gemini, keck, and uh)'), + sa.Column('partner_description', sa.String(), nullable=True, comment='Description of the partner'), + sa.Column('created_at', sa.DateTime(), server_default=sa.text("TIMEZONE('utc', CURRENT_TIMESTAMP)"), nullable=True, comment='The date and time in UTC when the record was created'), + sa.Column('updated_at', sa.DateTime(), nullable=True, comment='The date and time in UTC when the record was last updated'), + sa.PrimaryKeyConstraint('partner_id'), + sa.UniqueConstraint('partner_id'), + sa.UniqueConstraint('partner_name') + ) + op.add_column('proposal', sa.Column('partner_id', sa.Integer(), nullable=True)) + op.create_foreign_key(None, 'proposal', 'partner', ['partner_id'], ['partner_id']) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(None, 'proposal', type_='foreignkey') + op.drop_column('proposal', 'partner_id') + op.drop_table('partner') + # ### end Alembic commands ### diff --git a/docs/examples/obsproc.md b/docs/examples/obsproc.md index 9aeb799..186c87d 100644 --- a/docs/examples/obsproc.md +++ b/docs/examples/obsproc.md @@ -68,9 +68,14 @@ z_sdss,SDSS z filter ```csv title="proposal_categories.csv" proposal_category_id,proposal_category_name,proposal_category_description 1,openuse,Subaru openuse proposal -2,keck,Subaru/Keck time exchange proposal -3,gemini,Subaru/Gemini time exchange proposal -4,uh,University of Hawaii proposal +``` + +```csv title="partner.csv" +partner_id,partner_name,partner_description +1,subaru,Subaru Telescope +2,keck,"W. M. Keck Observatory" +3,gemini,Gemini Telescope +4,uh,University of Hawaii ``` ```csv title="pfs_arm.csv" @@ -100,6 +105,7 @@ You can insert these data into the database using the following commands: ```console $ pfs-targetdb-cli insert filter_names.csv -c db_config.toml --table filter_name --commit $ pfs-targetdb-cli insert proposal_categories.csv -c db_config.toml --table proposal_category --commit +$ pfs-targetdb-cli insert partner.csv -c db_config.toml --table partner --commit $ pfs-targetdb-cli insert pfs_arm.csv -c db_config.toml --table pfs_arm --commit $ pfs-targetdb-cli insert target_types.csv -c db_config.toml --table target_type --commit ``` @@ -169,7 +175,7 @@ Suppose you have an Excel file named `pfs_allocation_summary.xlsx` with 2 sheets **`Proposals` Sheet**: | proposal_id | input_catalog_name | input_catalog_description | group_id | pi_first_name | pi_last_name | pi_middle_name | proposal_category_name | upload_id | n_obj | fiberhour_total | fiberhour_lr | fiberhour_mr | rot_total | rot_lr | rot_mr | -|-------------|--------------------|---------------------------|----------|---------------|--------------|----------------|------------------------|------------------|-------|-----------------|--------------|--------------|-----------|--------|--------| +| ----------- | ------------------ | ------------------------- | -------- | ------------- | ------------ | -------------- | ---------------------- | ---------------- | ----- | --------------- | ------------ | ------------ | --------- | ------ | ------ | | S99A-QT001 | pfs_example_1 | Example target list 1 | o99101 | Eiichi | Shibusawa | | openuse | d6e94eae259faf4e | 1572 | 379.5 | 379.5 | | 5.2 | 5.2 | | | S99A-QT002 | pfs_example_2 | Example target list 2 | o99102 | Umeko | Tsuda | | openuse | 5f695375c60f34c7 | 9712 | 17504 | 17504 | | 15.83 | 15.83 | | | S99A-QT003 | pfs_example_3 | Example target list 3 | o99103 | Shibasaburo | Kitasato | | openuse | ba59115da8084653 | 2047 | 395.25 | 395.25 | | 12.7 | 12.7 | | @@ -177,7 +183,7 @@ Suppose you have an Excel file named `pfs_allocation_summary.xlsx` with 2 sheets **`Allocation` Sheet**: | proposal_id | grade | rank | allocated_rot_total | allocated_rot_lr | allocated_rot_mr | allocated_time_total | allocated_time_lr | allocated_time_mr | n_ppc | allocation_rate_lr | allocation_rate_mr | completion_rate_lr | completion_rate_mr | -|-------------|-------|------|---------------------|------------------|------------------|----------------------|-------------------|-------------------|-------|--------------------|--------------------|--------------------|--------------------| +| ----------- | ----- | ---- | ------------------- | ---------------- | ---------------- | -------------------- | ----------------- | ----------------- | ----- | ------------------ | ------------------ | ------------------ | ------------------ | | S99A-QT001 | A | 9 | 2.8 | | 2.8 | 284.25 | 0 | 284.25 | 9 | 0.749011858 | | 0.723 | | | S99A-QT002 | B | 6.5 | 6.5 | 6.5 | | 8140.5 | 8140.5 | 0 | 21 | 0.465065128 | | 0.279 | | | S99A-QT003 | B | 6 | 9.6 | 9.6 | | 350.25 | 350.25 | 0 | 31 | 0.886148008 | | 0.684 | | @@ -268,4 +274,4 @@ pfs-targetdb-cli insert -c dbconf.toml -t user_pointing pointing_list.ecsv \ --commit --upload_id "aabbccddeeffgghh" ``` -Currently, you need to insert the custom pointing list one by one. We are planning to support batch insertion in the future. \ No newline at end of file +Currently, you need to insert the custom pointing list one by one. We are planning to support batch insertion in the future. diff --git a/docs/schema/partner.md b/docs/schema/partner.md new file mode 100644 index 0000000..45bc29d --- /dev/null +++ b/docs/schema/partner.md @@ -0,0 +1,32 @@ +# `partner` + +## Overview + +The `partner` table is used to store the information on partner institutions. + +## Columns + +Here are the columns in the `partner` table: + +| Column Name | Type | Description | Required[^1] | Default | +| ------------------- | -------- | ---------------------------------------------------------- | ------------ | ------- | +| partner_id | int | The unique identifier of the partner | \* | | +| partner_name | str | The name of the partner | \* | | +| partner_description | str | A brief description of the partner | | "" | +| created_at | datetime | The date and time in UTC when the record was created. | | | +| updated_at | datetime | The date and time in UTC when the record was last updated. | | | + +[^1]: Required when inserted by using the [CLI tool](../reference/cli.md) or equivalent functions. + +## Unique constraint + +- `partner_id` is the primary key of the table and must be unique. However, it not set as an auto-increment column. + +## Available proposal categories + +| partner_id | partner_name | partner_description | +| ---------: | ------------ | ---------------------- | +| 1 | subaru | Subaru Telescope | +| 2 | keck | W. M. Keck Observatory | +| 3 | gemini | Gemini Observatory | +| 4 | uh | University of Hawaii | diff --git a/docs/schema/proposal.md b/docs/schema/proposal.md index 2d6d211..e73e74d 100644 --- a/docs/schema/proposal.md +++ b/docs/schema/proposal.md @@ -9,7 +9,7 @@ The `proposal` table is used to store the information on proposals. Here are the columns in the `proposal` table: | Column Name | Type | Description | Unit | Required[^1] | Default | -|----------------------|----------|---------------------------------------------------------------------|------|--------------|---------| +| -------------------- | -------- | ------------------------------------------------------------------- | ---- | ------------ | ------- | | proposal_id | str | Proposal-ID (e.g, S23B-QN901) | | \* | | | group_id | str | Group ID issued by STARS (e.g., o21195) | | \* | | | pi_first_name | str | PI's first name | | | "" | @@ -21,6 +21,7 @@ Here are the columns in the `proposal` table: | allocated_time_lr | float | Allocated fiberhours for low-resolution mode | h | | 0 | | allocated_time_mr | float | Allocated fiberhours for medium-resolution mode | h | | 0 | | proposal_category_id | int | `proposal_category_id` in the `proposal_category` table | | | 0 | +| partner_id | int | `partner_id` in the `partner` table | | | | | is_too | bool | A flag to indicate if the proposal is a Target of Opportunity (ToO) | | | False | | created_at | datetime | The date and time in UTC when the record was created. | | | | | updated_at | datetime | The date and time in UTC when the record was last updated. | | | | @@ -35,6 +36,7 @@ Here are the columns in the `proposal` table: ## Foreign key constraints - `proposal_category_id` is a foreign key constraint that references the `proposal_category_id` in the `proposal_category` table. +- `partner_id` is a foreign key constraint that references the `partner_id` in the `partner` table ## Notes diff --git a/docs/schema/proposal_category.md b/docs/schema/proposal_category.md index a14eaac..b3406d6 100644 --- a/docs/schema/proposal_category.md +++ b/docs/schema/proposal_category.md @@ -24,9 +24,6 @@ Here are the columns in the `proposal_category` table: ## Available proposal categories -| proposal_category_id | proposal_category_name | proposal_category_description | -| -------------------: | ---------------------- | ------------------------------------ | -| 1 | openuse | Subaru openuse proposal | -| 2 | keck | Subaru/Keck time exchange proposal | -| 3 | gemini | Subaru/Gemini time exchange proposal | -| 4 | uh | University of Hawaii proposal | +| proposal_category_id | proposal_category_name | proposal_category_description | +| -------------------: | ---------------------- | ----------------------------- | +| 1 | openuse | Subaru openuse proposal | diff --git a/examples/data/partner.csv b/examples/data/partner.csv new file mode 100644 index 0000000..fd97bf1 --- /dev/null +++ b/examples/data/partner.csv @@ -0,0 +1,5 @@ +partner_id,partner_name,partner_description +1,subaru,Subaru Telescope +2,keck,"W. M. Keck Observatory" +3,gemini,Gemini Telescope +4,uh,University of Hawaii diff --git a/examples/data/proposal_category.csv b/examples/data/proposal_category.csv index 14c3b8e..c29956a 100644 --- a/examples/data/proposal_category.csv +++ b/examples/data/proposal_category.csv @@ -1,5 +1,2 @@ proposal_category_id,proposal_category_name,proposal_category_description 1,openuse,Subaru openuse proposal -2,keck,Subaru/Keck time exchange proposal -3,gemini,Subaru/Gemini time exchange proposal -4,uh,University of Hawaii proposal \ No newline at end of file diff --git a/src/targetdb/cli/cli_main.py b/src/targetdb/cli/cli_main.py index 26bf315..833c09c 100644 --- a/src/targetdb/cli/cli_main.py +++ b/src/targetdb/cli/cli_main.py @@ -47,6 +47,7 @@ class TargetdbTable(str, Enum): filter_name = "filter_name" fluxstd = "fluxstd" input_catalog = "input_catalog" + partner = "partner" pfs_arm = "pfs_arm" proposal = "proposal" proposal_category = "proposal_category" diff --git a/src/targetdb/models/__init__.py b/src/targetdb/models/__init__.py index 6d3e9b4..fa6519d 100644 --- a/src/targetdb/models/__init__.py +++ b/src/targetdb/models/__init__.py @@ -36,6 +36,7 @@ def pg_utcnow(element, compiler, **kw): from .filter_name import filter_name # noqa E402 from .pfs_arm import pfs_arm # noqa E402 from .proposal_category import proposal_category # noqa E402 +from .partner import partner # noqa E402 # from .proposal_grade import proposal_grade # noqa E402 from .input_catalog import input_catalog # noqa E402 diff --git a/src/targetdb/models/partner.py b/src/targetdb/models/partner.py new file mode 100644 index 0000000..eaa47ec --- /dev/null +++ b/src/targetdb/models/partner.py @@ -0,0 +1,44 @@ +#!/usr/bin/env python + +from sqlalchemy import ( + Column, + DateTime, + Integer, + String, +) +from sqlalchemy.orm import relationship + +from . import Base, comment_created_at, comment_updated_at, utcnow + + +class partner(Base): + __tablename__ = "partner" + + partner_id = Column( + Integer, + primary_key=True, + unique=True, + autoincrement=False, + comment="Unique identifier of the partner", + ) + partner_name = Column( + String, + unique=True, + nullable=False, + comment="Name of the partner (e.g., subaru, gemini, keck, and uh)", + ) + partner_description = Column( + String, default="", comment="Description of the partner" + ) + created_at = Column( + DateTime, + comment=comment_created_at, + server_default=utcnow(), + ) + updated_at = Column( + DateTime, + comment=comment_updated_at, + onupdate=utcnow(), + ) + + proposals = relationship("proposal", backref="partner") diff --git a/src/targetdb/models/proposal.py b/src/targetdb/models/proposal.py index 5a48a53..ff45d8b 100644 --- a/src/targetdb/models/proposal.py +++ b/src/targetdb/models/proposal.py @@ -7,6 +7,7 @@ Base, comment_created_at, comment_updated_at, + partner, proposal_category, # proposal_grade, utcnow, @@ -61,29 +62,15 @@ class proposal(Base): Integer, ForeignKey("proposal_category.proposal_category_id") ) - # is_queue = Column( - # Boolean, - # default=True, - # comment="True when the proposal contains queue-mode allocation", - # ) - # is_classical = Column( - # Boolean, - # default=False, - # comment="True when the proposal contains classical-mode allocation", - # ) + partner_id = Column( + Integer, + ForeignKey("partner.partner_id"), + ) is_too = Column(Boolean, default=False, comment="True when the proposal is ToO") - created_at = Column( - DateTime, - comment=comment_created_at, - server_default=utcnow(), - ) - updated_at = Column( - DateTime, - comment=comment_updated_at, - onupdate=utcnow(), - ) + created_at = Column(DateTime, comment=comment_created_at, server_default=utcnow()) + updated_at = Column(DateTime, comment=comment_updated_at, onupdate=utcnow()) proposal_categories = relationship(proposal_category, backref=backref("proposal")) # proposal_grades = relationship("proposal_grade", back_populates="proposal") @@ -101,6 +88,7 @@ def __init__( allocated_time_lr, allocated_time_mr, proposal_category_id, + partner_id, is_too, created_at, updated_at, @@ -116,6 +104,7 @@ def __init__( self.allocated_time_lr = allocated_time_lr self.allocated_time_mr = allocated_time_mr self.proposal_category_id = proposal_category_id + self.partner_id = partner_id self.is_too = is_too self.created_at = created_at self.updated_at = updated_at From b0ed833e7c90758bfdd4ff6535ca47f83eb4b0b7 Mon Sep 17 00:00:00 2001 From: Masato Onodera Date: Fri, 20 Dec 2024 15:47:33 -1000 Subject: [PATCH 2/5] update Dockerfile to postgres16 --- examples/docker/Dockerfile | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/examples/docker/Dockerfile b/examples/docker/Dockerfile index 0698e41..58f1310 100644 --- a/examples/docker/Dockerfile +++ b/examples/docker/Dockerfile @@ -1,6 +1,7 @@ # Use the official Docker Hub Postgres 10.6 image # FROM postgres:10.6 -FROM postgres:12 +# FROM postgres:12 +FROM postgres:16 # Set environment variables ENV POSTGRES_USER "" @@ -11,8 +12,11 @@ ENV POSTGRES_DB "" RUN apt-get update && apt-get install -y \ git \ build-essential \ + liblz4-dev \ + libreadline-dev \ + libzstd-dev \ zlib1g-dev \ - postgresql-server-dev-12 + postgresql-server-dev-16 # Clone the q3c extension from GitHub RUN git clone https://github.com/segasai/q3c.git @@ -31,4 +35,4 @@ EXPOSE 5432 VOLUME ["/etc/postgresql", "/var/log/postgresql", "/var/lib/postgresql"] # Set the default command to run when starting the container -CMD ["postgres"] \ No newline at end of file +CMD ["postgres"] From dc1973e7ea80386a41942db1ad91a84269c28c00 Mon Sep 17 00:00:00 2001 From: Masato Onodera Date: Fri, 20 Dec 2024 15:51:23 -1000 Subject: [PATCH 3/5] add tbls schema info --- docs/tbls/README.md | 8 +++++++ docs/tbls/public.partner.md | 46 +++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 docs/tbls/public.partner.md diff --git a/docs/tbls/README.md b/docs/tbls/README.md index 52450d8..b15a707 100644 --- a/docs/tbls/README.md +++ b/docs/tbls/README.md @@ -15,6 +15,7 @@ | [public.fluxstd](public.fluxstd.md) | 61 | | BASE TABLE | | [public.target](public.target.md) | 61 | | BASE TABLE | | [public.cluster](public.cluster.md) | 10 | | BASE TABLE | +| [public.partner](public.partner.md) | 5 | | BASE TABLE | ## Stored procedures and functions @@ -310,6 +311,13 @@ erDiagram timestamp_without_time_zone created_at timestamp_without_time_zone updated_at } +"public.partner" { + integer partner_id + varchar partner_name + varchar partner_description + timestamp_without_time_zone created_at + timestamp_without_time_zone updated_at +} ``` --- diff --git a/docs/tbls/public.partner.md b/docs/tbls/public.partner.md new file mode 100644 index 0000000..e29cc6a --- /dev/null +++ b/docs/tbls/public.partner.md @@ -0,0 +1,46 @@ +# public.partner + +## Description + +## Columns + +| Name | Type | Default | Nullable | Children | Parents | Comment | +| ---- | ---- | ------- | -------- | -------- | ------- | ------- | +| partner_id | integer | | false | | | Unique identifier of the partner | +| partner_name | varchar | | false | | | Name of the partner (e.g., subaru, gemini, keck, and uh) | +| partner_description | varchar | | true | | | Description of the partner | +| created_at | timestamp without time zone | timezone('utc'::text, CURRENT_TIMESTAMP) | true | | | The date and time in UTC when the record was created | +| updated_at | timestamp without time zone | | true | | | The date and time in UTC when the record was last updated | + +## Constraints + +| Name | Type | Definition | +| ---- | ---- | ---------- | +| partner_pkey | PRIMARY KEY | PRIMARY KEY (partner_id) | +| partner_partner_name_key | UNIQUE | UNIQUE (partner_name) | + +## Indexes + +| Name | Definition | +| ---- | ---------- | +| partner_pkey | CREATE UNIQUE INDEX partner_pkey ON public.partner USING btree (partner_id) | +| partner_partner_name_key | CREATE UNIQUE INDEX partner_partner_name_key ON public.partner USING btree (partner_name) | + +## Relations + +```mermaid +erDiagram + + +"public.partner" { + integer partner_id + varchar partner_name + varchar partner_description + timestamp_without_time_zone created_at + timestamp_without_time_zone updated_at +} +``` + +--- + +> Generated by [tbls](https://github.com/k1LoW/tbls) From e879f868dd3de1d273bef066d7998a512b1375d2 Mon Sep 17 00:00:00 2001 From: Masato Onodera Date: Fri, 20 Dec 2024 16:00:45 -1000 Subject: [PATCH 4/5] Update schemacrawler to v16.24.x - CLI code is modified to accommodate the possible path change. Older versions are not compatible --- diagrams/erdiagram_targetdb-20241220155829.pdf | Bin 0 -> 36507 bytes src/targetdb/utils.py | 3 ++- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 diagrams/erdiagram_targetdb-20241220155829.pdf diff --git a/diagrams/erdiagram_targetdb-20241220155829.pdf b/diagrams/erdiagram_targetdb-20241220155829.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4e38b84b88642fddcbc1b0c9ddfbb30e978e3ad5 GIT binary patch literal 36507 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 G=6?YWhJn2R literal 0 HcmV?d00001 diff --git a/src/targetdb/utils.py b/src/targetdb/utils.py index 3a9d364..ad8c2c1 100644 --- a/src/targetdb/utils.py +++ b/src/targetdb/utils.py @@ -307,7 +307,8 @@ def draw_diagram( outfile = os.path.join(output_dir, f"{sc_outprefix}-{time_string}.pdf") comm = [ - f"{os.path.join(config['schemacrawler']['SCHEMACRAWLERDIR'],'_schemacrawler/bin/schemacrawler.sh')}", + f"{os.path.join(config['schemacrawler']['SCHEMACRAWLERDIR'],'bin/schemacrawler.sh')}", + # f"{os.path.join(config['schemacrawler']['SCHEMACRAWLERDIR'],'_schemacrawler/bin/schemacrawler.sh')}", "--command=schema", "--server=postgresql", f"--host={config['targetdb']['db']['host']}", From c3aeaa440bb4bd7e6d91d99b335d38b8a14c0e2c Mon Sep 17 00:00:00 2001 From: Masato Onodera Date: Fri, 20 Dec 2024 16:07:14 -1000 Subject: [PATCH 5/5] add partner to __all__ --- src/targetdb/models/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/targetdb/models/__init__.py b/src/targetdb/models/__init__.py index fa6519d..a5d9d0d 100644 --- a/src/targetdb/models/__init__.py +++ b/src/targetdb/models/__init__.py @@ -55,6 +55,7 @@ def pg_utcnow(element, compiler, **kw): "filter_name", "pfs_arm", "proposal_category", + "partner", # "proposal_grade", "input_catalog", "user_pointing",