<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
            http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">

    <property name="objectAssociationDescriptionType" value="VARCHAR(512)" dbms="oracle,postgresql,mssql"/>
    <property name="objectAssociationDescriptionType" value="TEXT" dbms="mysql"/>

    <changeSet id="01-create-object-association-table" author="dmiller" dbms="oracle,postgresql,mssql">
        <createTable tableName="acm_object_association">
            <column name="cm_association_id" type="${idType}">
                <constraints primaryKey="true" primaryKeyName="pk_object_association"/>
            </column>
            <column name="cm_association_status" type="VARCHAR(128)" defaultValue="ACTIVE">
                <constraints nullable="false"/>
            </column>
            <column name="cm_object_assn_created" type="${timestampType}">
                <constraints nullable="false"/>
            </column>
            <column name="cm_object_assn_creator" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_object_assn_modified" type="${timestampType}">
                <constraints nullable="false"/>
            </column>
            <column name="cm_object_assn_modifier" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_parent_type" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_parent_id" type="${fkIdType}">
                <constraints nullable="false"/>
            </column>
            <column name="cm_parent_name" type="VARCHAR(1024)">
                <constraints nullable="true"/>
            </column>
            <column name="cm_target_type" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_target_id" type="${fkIdType}">
                <constraints nullable="false"/>
            </column>
            <column name="cm_target_name" type="VARCHAR(1024)">
                <constraints nullable="true"/>
            </column>
        </createTable>

        <createIndex tableName="acm_object_association" indexName="idx_object_assn_parent_id">
            <column name="cm_parent_id"/>
        </createIndex>
        <createIndex tableName="acm_object_association" indexName="idx_object_assn_target_id">
            <column name="cm_target_id"/>
        </createIndex>
    </changeSet>

    <changeSet id="01-create-object-association-table" author="dmiller" dbms="mysql">
        <createTable tableName="acm_object_association">
            <column name="cm_association_id" type="${idType}">
                <constraints primaryKey="true" primaryKeyName="pk_object_association"/>
            </column>
            <column name="cm_association_status" type="VARCHAR(128)" defaultValue="ACTIVE">
                <constraints nullable="false"/>
            </column>
            <column name="cm_object_assn_created" type="${timestampType}" defaultValueComputed="${timestampFunction}">
                <constraints nullable="false"/>
            </column>
            <column name="cm_object_assn_creator" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_object_assn_modified" type="${timestampType}" defaultValueComputed="${timestampFunction}">
                <constraints nullable="false"/>
            </column>
            <column name="cm_object_assn_modifier" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_parent_type" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_parent_id" type="${fkIdType}">
                <constraints nullable="false"/>
            </column>
            <column name="cm_parent_name" type="VARCHAR(1024)">
                <constraints nullable="true"/>
            </column>
            <column name="cm_target_type" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_target_id" type="${fkIdType}">
                <constraints nullable="false"/>
            </column>
            <column name="cm_target_name" type="VARCHAR(1024)">
                <constraints nullable="true"/>
            </column>
        </createTable>

        <createIndex tableName="acm_object_association" indexName="idx_object_assn_parent_id">
            <column name="cm_parent_id"/>
        </createIndex>
        <createIndex tableName="acm_object_association" indexName="idx_object_assn_target_id">
            <column name="cm_target_id"/>
        </createIndex>
    </changeSet>

    <changeSet id="02-widen-object-names" author="dmiller">
        <modifyDataType tableName="acm_object_association" columnName="cm_parent_name" newDataType="VARCHAR2(4000)"/>
        <modifyDataType tableName="acm_object_association" columnName="cm_target_name" newDataType="VARCHAR2(4000)"/>
    </changeSet>

    <changeSet id="03-object-assn-switch-to-sequence-pk" author="dmiller" dbms="${excludeMSSQL}">
        <dropDefaultValue tableName="acm_object_association" columnName="cm_association_id"/>
        <modifyDataType tableName="acm_object_association" columnName="cm_association_id" newDataType="${fkIdType}"/>
    </changeSet>

    <changeSet id="03-1-object-assn-switch-to-sequence-pk-mssql" author="riste.tutureski" dbms="mssql" failOnError="false">
        <dropDefaultValue tableName="acm_object_association" columnName="cm_association_id"/>
    </changeSet>

    <changeSet id="03-2-object-assn-switch-to-sequence-pk-mssql" author="riste.tutureski" dbms="mssql">
        <dropPrimaryKey tableName="acm_object_association" constraintName="pk_object_association"/>
    </changeSet>

    <changeSet id="03-3-object-assn-switch-to-sequence-pk-mssql" author="riste.tutureski" dbms="mssql">
        <modifyDataType tableName="acm_object_association" columnName="cm_association_id" newDataType="${fkIdType}"/>
    </changeSet>

    <changeSet id="03-4-object-assn-switch-to-sequence-pk-mssql" author="riste.tutureski" dbms="mssql">
        <addNotNullConstraint tableName="acm_object_association" columnName="cm_association_id" columnDataType="${fkIdType}"/>
        <addPrimaryKey tableName="acm_object_association" columnNames="cm_association_id" constraintName="pk_object_association"/>
    </changeSet>

    <changeSet id="04-fix-object-id-type" author="dmiller">
        <modifyDataType tableName="acm_object_association" columnName="cm_parent_id" newDataType="${fkIdType}"/>
        <modifyDataType tableName="acm_object_association" columnName="cm_target_id" newDataType="${fkIdType}"/>
    </changeSet>

    <changeSet id="object-association-05-add-category-and-subtype" author="dmiller">
        <addColumn tableName="acm_object_association">
            <column name="cm_target_category" type="VARCHAR(128)"/>
        </addColumn>
        <addColumn tableName="acm_object_association">
            <column name="cm_target_subtype" type="VARCHAR(128)"/>
        </addColumn>
    </changeSet>

    <changeSet id="object-association-06-add-association-type" author="dmiller">
        <addColumn tableName="acm_object_association">
            <column name="cm_association_type" type="VARCHAR(128)"/>
        </addColumn>
    </changeSet>

    <changeSet id="object-association-07-populate-association-type" author="dmiller">
        <update tableName="acm_object_association">
            <column name="cm_association_type" value="REFERENCE"/>
            <where>cm_target_type IN ('CASE', 'CASE_FILE', 'COMPLAINT')</where>
        </update>
        <update tableName="acm_object_association">
            <column name="cm_association_type" value="OWNERSHIP"/>
            <where>cm_target_type NOT IN ('CASE', 'CASE_FILE', 'COMPLAINT')</where>
        </update>
    </changeSet>

    <changeSet id="08-acm_object_association-id" author="nebojsha.davidovikj">
        <createTable tableName="acm_object_association_id">
            <column name="cm_seq_num" type="${idType}"/>
            <column name="cm_seq_name" type="VARCHAR(255)"/>
        </createTable>
        <insert tableName="acm_object_association_id">
            <column name="cm_seq_num" value="100"></column>
            <column name="cm_seq_name" value="acm_object_association"></column>
        </insert>
    </changeSet>

    <changeSet id="09-acm-object-association-add-target-title" author="tsedalu">
        <addColumn tableName="acm_object_association">
            <column name="cm_target_title" type="VARCHAR(1024)"/>
        </addColumn>
    </changeSet>
    <changeSet id="10-acm-object-association-add-column" author="nebojsha.davidovikj">
        <addColumn tableName="acm_object_association">
            <column name="cm_inverse_association_id" type="${fkIdType}">
                <constraints foreignKeyName="fk_inverse_object_association_id" referencedTableName="acm_object_association"
                    referencedColumnNames="cm_association_id" deferrable="${deferrable}" initiallyDeferred="${initially.deferred}"/>
            </column>
        </addColumn>
    </changeSet>

    <changeSet id="12-acm-object-association-add-column" author="nebojsha.davidovikj">
        <addColumn tableName="acm_object_association">
            <column name="cm_description" type="${objectAssociationDescriptionType}"/>
        </addColumn>
    </changeSet>

    <changeSet id="01-change_cm_cm_object_association_datetime" author="mario.gjurcheski" dbms="mysql">
        <modifyDataType tableName="acm_object_association" columnName="cm_object_assn_created" newDataType="DATETIME"/>
        <modifyDataType tableName="acm_object_association" columnName="cm_object_assn_modified" newDataType="DATETIME"/>
    </changeSet>

    <changeSet id="13-add-discriminator-column-extensibility" author="aleksandar.acevski">
        <addColumn tableName="acm_object_association">
            <column name="cm_class_name" type="VARCHAR(400)"
                    defaultValue="com.armedia.acm.plugins.objectassociation.model.ObjectAssociation">
                <constraints nullable="false"/>
            </column>
        </addColumn>
    </changeSet>


</databaseChangeLog>

