This is an automated email from the ASF dual-hosted git repository.

fokko pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/iceberg.git


The following commit(s) were added to refs/heads/main by this push:
     new a66166326d Open-API: Refactor TableRequirements (#7710)
a66166326d is described below

commit a66166326d0ab3ee54065ac3accd6a3a1c3b89d9
Author: Fokko Driesprong <fo...@apache.org>
AuthorDate: Mon Oct 30 16:58:59 2023 +0100

    Open-API: Refactor TableRequirements (#7710)
    
    * Open-API: Refactor TableRequirements
    
    I believe the constraints are not defined in the right way.
    After generating code I got:
    
    ```python
    class TableRequirement(BaseModel):
        type: Literal[
            'assert-create',
            'assert-table-uuid',
            'assert-ref-snapshot-id',
            'assert-last-assigned-field-id',
            'assert-current-schema-id',
            'assert-last-assigned-partition-id',
            'assert-default-spec-id',
            'assert-default-sort-order-id',
        ]
        ref: Optional[str] = None
        uuid: Optional[str] = None
        snapshot_id: Optional[int] = Field(None, alias='snapshot-id')
        last_assigned_field_id: Optional[int] = Field(None, 
alias='last-assigned-field-id')
        current_schema_id: Optional[int] = Field(None, 
alias='current-schema-id')
        last_assigned_partition_id: Optional[int] = Field(
            None, alias='last-assigned-partition-id'
        )
        default_spec_id: Optional[int] = Field(None, alias='default-spec-id')
        default_sort_order_id: Optional[int] = Field(None, 
alias='default-sort-order-id')
    ```
    
    Which encapulates all the requirements. After the refactor in this
    PR, we'll end up with:
    
    ```python
    class AssertCreate(BaseModel):
        type: Literal['assert-create']
    
    class AssertTableUUID(BaseModel):
        type: Literal['assert-table-uuid']
        uuid: str
    
    class AssertRefSnapshotId(BaseModel):
        type: Literal['assert-ref-snapshot-id']
        ref: str
        snapshot_id: int = Field(..., alias='snapshot-id')
    
    class AssertLastAssignedFieldId(BaseModel):
        type: Literal['assert-last-assigned-field-id']
        last_assigned_partition_id: int = Field(..., 
alias='last-assigned-partition-id')
    
    class AssertCurrentSchemaId(BaseModel):
        type: Literal['assert-current-schema-id']
        current_schema_id: int = Field(..., alias='current-schema-id')
    
    class AssertLastAssignedPartitionId(BaseModel):
        type: Literal['assert-last-assigned-partition-id']
        last_assigned_partition_id: int = Field(..., 
alias='last-assigned-partition-id')
    
    class AssertDefaultSpecId(BaseModel):
        type: Literal['assert-default-spec-id']
        default_spec_id: int = Field(..., alias='default-spec-id')
    
    class AssertDefaultSortOrderId(BaseModel):
        type: Literal['assert-default-sort-order-id']
        default_sort_order_id: int = Field(..., alias='default-sort-order-id')
    
    class TableRequirement(BaseModel):
        __root__: Union[
            AssertCreate,
            AssertTableUUID,
            AssertRefSnapshotId,
            AssertLastAssignedFieldId,
            AssertCurrentSchemaId,
            AssertLastAssignedPartitionId,
            AssertDefaultSpecId,
            AssertDefaultSortOrderId,
        ] = Field(..., discriminator='type')
    ```
    
    Which makes sense to me.
    
    * Apply suggestions from code review
    
    Co-authored-by: Eduard Tudenhoefner <etudenhoef...@gmail.com>
    
    * WIP
    
    * Fixed the inheritance
    
    * Generate the code
    
    * Fix order
    
    ---------
    
    Co-authored-by: Eduard Tudenhoefner <etudenhoef...@gmail.com>
---
 open-api/rest-catalog-open-api.py   | 103 ++++++++++++++++++--------
 open-api/rest-catalog-open-api.yaml | 142 +++++++++++++++++++++++++++++-------
 2 files changed, 187 insertions(+), 58 deletions(-)

diff --git a/open-api/rest-catalog-open-api.py 
b/open-api/rest-catalog-open-api.py
index 5295240256..4db1fccdc2 100644
--- a/open-api/rest-catalog-open-api.py
+++ b/open-api/rest-catalog-open-api.py
@@ -302,38 +302,79 @@ class RemovePropertiesUpdate(BaseUpdate):
 
 
 class TableRequirement(BaseModel):
+    type: str
+
+
+class AssertCreate(TableRequirement):
     """
-    Assertions from the client that must be valid for the commit to succeed. 
Assertions are identified by `type` -
-    - `assert-create` - the table must not already exist; used for create 
transactions
-    - `assert-table-uuid` - the table UUID must match the requirement's `uuid`
-    - `assert-ref-snapshot-id` - the table branch or tag identified by the 
requirement's `ref` must reference the requirement's `snapshot-id`; if 
`snapshot-id` is `null` or missing, the ref must not already exist
-    - `assert-last-assigned-field-id` - the table's last assigned column id 
must match the requirement's `last-assigned-field-id`
-    - `assert-current-schema-id` - the table's current schema id must match 
the requirement's `current-schema-id`
-    - `assert-last-assigned-partition-id` - the table's last assigned 
partition id must match the requirement's `last-assigned-partition-id`
-    - `assert-default-spec-id` - the table's default spec id must match the 
requirement's `default-spec-id`
-    - `assert-default-sort-order-id` - the table's default sort order id must 
match the requirement's `default-sort-order-id`
-    """
-
-    type: Literal[
-        'assert-create',
-        'assert-table-uuid',
-        'assert-ref-snapshot-id',
-        'assert-last-assigned-field-id',
-        'assert-current-schema-id',
-        'assert-last-assigned-partition-id',
-        'assert-default-spec-id',
-        'assert-default-sort-order-id',
-    ]
-    ref: Optional[str] = None
-    uuid: Optional[str] = None
-    snapshot_id: Optional[int] = Field(None, alias='snapshot-id')
-    last_assigned_field_id: Optional[int] = Field(None, 
alias='last-assigned-field-id')
-    current_schema_id: Optional[int] = Field(None, alias='current-schema-id')
-    last_assigned_partition_id: Optional[int] = Field(
-        None, alias='last-assigned-partition-id'
-    )
-    default_spec_id: Optional[int] = Field(None, alias='default-spec-id')
-    default_sort_order_id: Optional[int] = Field(None, 
alias='default-sort-order-id')
+    The table must not already exist; used for create transactions
+    """
+
+    type: Literal['assert-create']
+
+
+class AssertTableUUID(TableRequirement):
+    """
+    The table UUID must match the requirement's `uuid`
+    """
+
+    type: Literal['assert-table-uuid']
+    uuid: str
+
+
+class AssertRefSnapshotId(TableRequirement):
+    """
+    The table branch or tag identified by the requirement's `ref` must 
reference the requirement's `snapshot-id`; if `snapshot-id` is `null` or 
missing, the ref must not already exist
+    """
+
+    type: Literal['assert-ref-snapshot-id']
+    ref: str
+    snapshot_id: int = Field(..., alias='snapshot-id')
+
+
+class AssertLastAssignedFieldId(TableRequirement):
+    """
+    The table's last assigned column id must match the requirement's 
`last-assigned-field-id`
+    """
+
+    type: Literal['assert-last-assigned-field-id']
+    last_assigned_field_id: int = Field(..., alias='last-assigned-field-id')
+
+
+class AssertCurrentSchemaId(TableRequirement):
+    """
+    The table's current schema id must match the requirement's 
`current-schema-id`
+    """
+
+    type: Literal['assert-current-schema-id']
+    current_schema_id: int = Field(..., alias='current-schema-id')
+
+
+class AssertLastAssignedPartitionId(TableRequirement):
+    """
+    The table's last assigned partition id must match the requirement's 
`last-assigned-partition-id`
+    """
+
+    type: Literal['assert-last-assigned-partition-id']
+    last_assigned_partition_id: int = Field(..., 
alias='last-assigned-partition-id')
+
+
+class AssertDefaultSpecId(TableRequirement):
+    """
+    The table's default spec id must match the requirement's `default-spec-id`
+    """
+
+    type: Literal['assert-default-spec-id']
+    default_spec_id: int = Field(..., alias='default-spec-id')
+
+
+class AssertDefaultSortOrderId(TableRequirement):
+    """
+    The table's default sort order id must match the requirement's 
`default-sort-order-id`
+    """
+
+    type: Literal['assert-default-sort-order-id']
+    default_sort_order_id: int = Field(..., alias='default-sort-order-id')
 
 
 class RegisterTableRequest(BaseModel):
diff --git a/open-api/rest-catalog-open-api.yaml 
b/open-api/rest-catalog-open-api.yaml
index ff1984784c..9370ef8f2d 100644
--- a/open-api/rest-catalog-open-api.yaml
+++ b/open-api/rest-catalog-open-api.yaml
@@ -1879,54 +1879,142 @@ components:
         - $ref: '#/components/schemas/RemovePropertiesUpdate'
 
     TableRequirement:
-      description:
-        Assertions from the client that must be valid for the commit to 
succeed. Assertions are identified by `type` -
-
-        - `assert-create` - the table must not already exist; used for create 
transactions
-
-        - `assert-table-uuid` - the table UUID must match the requirement's 
`uuid`
-
-        - `assert-ref-snapshot-id` - the table branch or tag identified by the 
requirement's `ref` must reference the requirement's `snapshot-id`; if 
`snapshot-id` is `null` or missing, the ref must not already exist
-
-        - `assert-last-assigned-field-id` - the table's last assigned column 
id must match the requirement's `last-assigned-field-id`
-
-        - `assert-current-schema-id` - the table's current schema id must 
match the requirement's `current-schema-id`
-
-        - `assert-last-assigned-partition-id` - the table's last assigned 
partition id must match the requirement's `last-assigned-partition-id`
-
-        - `assert-default-spec-id` - the table's default spec id must match 
the requirement's `default-spec-id`
+      discriminator:
+        propertyName: type
+        mapping:
+          assert-create: '#/components/schemas/AssertCreate'
+          assert-table-uuid: '#/components/schemas/AssertTableUUID'
+          assert-ref-snapshot-id: '#/components/schemas/AssertRefSnapshotId'
+          assert-last-assigned-field-id: 
'#/components/schemas/AssertLastAssignedFieldId'
+          assert-current-schema-id: 
'#/components/schemas/AssertCurrentSchemaId'
+          assert-last-assigned-partition-id: 
'#/components/schemas/AssertLastAssignedPartitionId'
+          assert-default-spec-id: '#/components/schemas/AssertDefaultSpecId'
+          assert-default-sort-order-id: 
'#/components/schemas/AssertDefaultSortOrderId'
+      type: object
+      required:
+        - type
+      properties:
+        type:
+          type: "string"
 
-        - `assert-default-sort-order-id` - the table's default sort order id 
must match the requirement's `default-sort-order-id`
+    AssertCreate:
+      allOf:
+        - $ref: "#/components/schemas/TableRequirement"
       type: object
+      description: The table must not already exist; used for create 
transactions
       required:
         - type
       properties:
         type:
           type: string
-          enum:
-            - assert-create
-            - assert-table-uuid
-            - assert-ref-snapshot-id
-            - assert-last-assigned-field-id
-            - assert-current-schema-id
-            - assert-last-assigned-partition-id
-            - assert-default-spec-id
-            - assert-default-sort-order-id
-        ref:
+          enum: ["assert-create"]
+
+    AssertTableUUID:
+      allOf:
+        - $ref: "#/components/schemas/TableRequirement"
+      description: The table UUID must match the requirement's `uuid`
+      required:
+        - type
+        - uuid
+      properties:
+        type:
           type: string
+          enum: ["assert-table-uuid"]
         uuid:
           type: string
+
+    AssertRefSnapshotId:
+      allOf:
+        - $ref: "#/components/schemas/TableRequirement"
+      description:
+        The table branch or tag identified by the requirement's `ref` must 
reference the requirement's `snapshot-id`; 
+        if `snapshot-id` is `null` or missing, the ref must not already exist
+      required:
+        - type
+        - ref
+        - snapshot-id
+      properties:
+        type:
+          type: string
+          enum: [ "assert-ref-snapshot-id" ]
+        ref:
+          type: string
         snapshot-id:
           type: integer
           format: int64
+
+    AssertLastAssignedFieldId:
+      allOf:
+        - $ref: "#/components/schemas/TableRequirement"
+      description:
+        The table's last assigned column id must match the requirement's 
`last-assigned-field-id`
+      required:
+        - type
+        - last-assigned-field-id
+      properties:
+        type:
+          type: string
+          enum: [ "assert-last-assigned-field-id" ]
         last-assigned-field-id:
           type: integer
+
+    AssertCurrentSchemaId:
+      allOf:
+        - $ref: "#/components/schemas/TableRequirement"
+      description:
+        The table's current schema id must match the requirement's 
`current-schema-id`
+      required:
+        - type
+        - current-schema-id
+      properties:
+        type:
+          type: string
+          enum: [ "assert-current-schema-id" ]
         current-schema-id:
           type: integer
+
+    AssertLastAssignedPartitionId:
+      allOf:
+        - $ref: "#/components/schemas/TableRequirement"
+      description:
+        The table's last assigned partition id must match the requirement's 
`last-assigned-partition-id`
+      required:
+        - type
+        - last-assigned-partition-id
+      properties:
+        type:
+          type: string
+          enum: [ "assert-last-assigned-partition-id" ]
         last-assigned-partition-id:
           type: integer
+
+    AssertDefaultSpecId:
+      allOf:
+        - $ref: "#/components/schemas/TableRequirement"
+      description:
+        The table's default spec id must match the requirement's 
`default-spec-id`
+      required:
+        - type
+        - default-spec-id
+      properties:
+        type:
+          type: string
+          enum: [ "assert-default-spec-id" ]
         default-spec-id:
           type: integer
+
+    AssertDefaultSortOrderId:
+      allOf:
+        - $ref: "#/components/schemas/TableRequirement"
+      description:
+        The table's default sort order id must match the requirement's 
`default-sort-order-id`
+      required:
+        - type
+        - default-sort-order-id
+      properties:
+        type:
+          type: string
+          enum: [ "assert-default-sort-order-id" ]
         default-sort-order-id:
           type: integer
 

Reply via email to