Request ID for call requests migration

pull/892/head
kompotkot 2023-08-10 10:40:46 +00:00
rodzic 9a7b1ea47e
commit 663c2be9d9
2 zmienionych plików z 83 dodań i 1 usunięć

Wyświetl plik

@ -0,0 +1,75 @@
"""Request ID bytes column
Revision ID: 040f2dfde5a5
Revises: b4257b10daaf
Create Date: 2023-08-10 08:58:22.052336
"""
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql
# revision identifiers, used by Alembic.
revision = '040f2dfde5a5'
down_revision = 'b4257b10daaf'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.add_column('call_requests', sa.Column('request_id', sa.BigInteger(), nullable=True))
op.create_index(op.f('ix_call_requests_request_id'), 'call_requests', ['request_id'], unique=False)
op.create_unique_constraint(op.f('uq_call_requests_registered_contract_id'), 'call_requests', ['registered_contract_id', 'request_id'])
# Manual
# Fetch IDs of duplicates for 'dropper-v0.2.0' call_request_type and delete it
op.execute("""WITH Duplicates AS (
SELECT
id,
registered_contract_id,
call_request_type_name,
parameters->'requestID' AS request_id,
created_at,
ROW_NUMBER() OVER (
PARTITION BY
registered_contract_id,
call_request_type_name,
parameters->'requestID'
ORDER BY created_at ASC
) AS row_num
FROM call_requests
WHERE call_request_type_name = 'dropper-v0.2.0'
),
DeleteDuplicates AS (
SELECT id
FROM
Duplicates
WHERE
row_num < (
SELECT COUNT(*) FROM Duplicates d2
WHERE d2.registered_contract_id = Duplicates.registered_contract_id
AND d2.call_request_type_name = Duplicates.call_request_type_name
AND d2.request_id = Duplicates.request_id
)
)
DELETE FROM call_requests WHERE id IN (SELECT id FROM DeleteDuplicates);""")
# Fulfill not empty requestID values
op.execute("UPDATE call_requests SET request_id = CAST(parameters->>'requestID' AS bigint) WHERE parameters->>'requestID' IS NOT NULL;")
# Fulfill raw types with random requestID
op.execute("UPDATE call_requests SET request_id = FLOOR(RANDOM()* 120500600 + 120400600) WHERE parameters->>'requestID' IS NULL;")
op.alter_column("call_requests", "request_id", nullable=False)
# Other
op.create_unique_constraint(op.f('uq_blockchains_id'), 'blockchains', ['id'])
op.create_unique_constraint(op.f('uq_call_request_types_name'), 'call_request_types', ['name'])
op.create_unique_constraint(op.f('uq_metatx_requesters_id'), 'metatx_requesters', ['id'])
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_index(op.f('ix_call_requests_request_id'), table_name='call_requests')
op.drop_column('call_requests', 'request_id')
# ### end Alembic commands ###

Wyświetl plik

@ -13,7 +13,7 @@ from sqlalchemy import (
UniqueConstraint,
Integer,
)
from sqlalchemy.dialects.postgresql import JSONB, UUID, ARRAY
from sqlalchemy.dialects.postgresql import JSONB, UUID
from sqlalchemy.ext.compiler import compiles
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base
@ -278,6 +278,12 @@ class RegisteredContract(Base): # type: ignore
class CallRequest(Base):
__tablename__ = "call_requests"
__table_args__ = (
UniqueConstraint(
"registered_contract_id",
"request_id",
),
)
id = Column(
UUID(as_uuid=True),
@ -304,6 +310,7 @@ class CallRequest(Base):
caller = Column(VARCHAR(256), nullable=False, index=True)
method = Column(String, nullable=False, index=True)
request_id = Column(BigInteger, nullable=False, index=True)
# TODO(zomglings): Should we conditional indices on parameters depending on the contract type?
parameters = Column(JSONB, nullable=False)