<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">

    <changeSet id="01-person-organization-foreign-keys" author="nebojsha.davidovikj">

        <addForeignKeyConstraint baseTableName="acm_person_org_assoc" baseColumnNames="cm_person_id"
            constraintName="fk_person_org_assoc_person_id" referencedTableName="acm_person" referencedColumnNames="cm_person_id"
            deferrable="${deferrable}" initiallyDeferred="${initially.deferred}"/>

        <addForeignKeyConstraint baseTableName="acm_person_org_assoc" baseColumnNames="cm_organization_id"
            constraintName="fk_person_org_assoc_org_id" referencedTableName="acm_organization" referencedColumnNames="cm_organization_id"
            deferrable="${deferrable}" initiallyDeferred="${initially.deferred}"/>
    </changeSet>
    <changeSet id="02-unique_person-organization-association_type_cleanup" author="bojan.milenkoski" dbms="mysql">
        <sql endDelimiter="\nGO" splitStatements="true" stripComments="true">
            <comment>Cleanup duplicate and null person to ogranization assoc type</comment>
            <![CDATA[
            delete from acm_person_org_assoc
            where cm_person_to_org_assoc_type is NULL or cm_org_to_person_assoc_type is NULL
GO

            DELETE poa1 FROM acm_person_org_assoc poa1, acm_person_org_assoc poa2 WHERE poa1.cm_id > poa2.cm_id 
            AND poa1.cm_person_id = poa2.cm_person_id AND poa1.cm_organization_id = poa2.cm_organization_id 
            AND poa1.cm_person_to_org_assoc_type = poa2.cm_person_to_org_assoc_type
GO
            ]]>
        </sql>
    </changeSet>
    <changeSet id="02-unique_person-organization-association_type_cleanup" author="ilinpetar" dbms="oracle,postgresql,mssql">
        <sql endDelimiter="\nGO" splitStatements="true" stripComments="true">
            <comment>Cleanup duplicate and null person to ogranization assoc type</comment>
            <![CDATA[
            delete from acm_person_org_assoc
            where cm_person_to_org_assoc_type is NULL or cm_org_to_person_assoc_type is NULL
GO

            DELETE FROM acm_person_org_assoc where cm_id in
            (SELECT poa1.cm_id from acm_person_org_assoc poa1, acm_person_org_assoc poa2
            WHERE poa1.cm_id > poa2.cm_id AND poa1.cm_person_id = poa2.cm_person_id
            AND poa1.cm_organization_id = poa2.cm_organization_id
            AND poa1.cm_person_to_org_assoc_type = poa2.cm_person_to_org_assoc_type)
GO
            ]]>
        </sql>
    </changeSet>
    <changeSet id="03-unique_person-organization-association_type" author="bojan.milenkoski" dbms="mysql">
        <addUniqueConstraint tableName="acm_person_org_assoc"
            columnNames="cm_person_id, cm_organization_id, cm_person_to_org_assoc_type(767)"/>
        <addUniqueConstraint tableName="acm_person_org_assoc"
            columnNames="cm_person_id, cm_organization_id, cm_org_to_person_assoc_type(767)"/>
    </changeSet>
    <changeSet id="03-unique_person-organization-association_type" author="bojan.milenkoski" dbms="oracle,postgresql,mssql">
        <addUniqueConstraint tableName="acm_person_org_assoc" columnNames="cm_person_id, cm_organization_id, cm_person_to_org_assoc_type"/>
        <addUniqueConstraint tableName="acm_person_org_assoc" columnNames="cm_person_id, cm_organization_id, cm_org_to_person_assoc_type"/>
    </changeSet>
</databaseChangeLog>
