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

    <property name="cmValueLength" value="4000" dbms="postgresql,oracle"/>
    <property name="cmValueLength" value="255" dbms="mysql,mssql"/>

    <property name="cmUserIdLength" value="1024" dbms="postgresql,oracle"/>
    <property name="cmUserIdLength" value="255" dbms="mysql,mssql"/>

    <property name="cmGroupNameLength" value="1024" dbms="postgresql,oracle"/>
    <property name="cmGroupNameLength" value="255" dbms="mysql,mssql"/>

    <property name="lowerUserId" value="LOWER(cm_user_id)" dbms="oracle"/>
    <property name="lowerUserId" value="lower(cm_user_id)" dbms="postgresql"/>
    <property name="lowerUserId" value="cm_user_id" dbms="mysql,mssql"/>

    <property name="cmGroupSupervisorIdLength" value="1024" dbms="postgresql,oracle"/>
    <property name="cmGroupSupervisorIdLength" value="255" dbms="mysql,mssql"/>

    <property name="cmUserDirectoryNameLength" value="1024" dbms="postgresql,oracle"/>
    <property name="cmUserDirectoryNameLength" value="255" dbms="mysql,mssql"/>

    <property name="cmRoleNameLength" value="1024" dbms="postgresql,oracle"/>
    <property name="cmRoleNameLength" value="255" dbms="mysql,mssql"/>

    <property name="currentTime" value="now()" dbms="postgresql,oracle, mssql"/>

    <changeSet id="01-user-service-tables" author="dmiller">
        <createTable tableName="acm_user">
            <column name="cm_user_id" type="VARCHAR(${cmUserIdLength})">
                <constraints nullable="false"/>
            </column>
            <column name="cm_user_directory_name" type="VARCHAR(${cmUserDirectoryNameLength})">
                <constraints nullable="false"/>
            </column>
            <column name="cm_full_name" type="VARCHAR(1024)"/>
            <column name="cm_user_created" type="DATE"></column>
            <column name="cm_user_modified" type="DATE">
                <constraints nullable="false"/>
            </column>
            <column name="cm_user_state" type="VARCHAR(256)">
                <constraints nullable="false"/>
            </column>
        </createTable>

        <createTable tableName="acm_user_role">
            <column name="cm_user_id" type="VARCHAR(${cmUserIdLength})">
                <constraints nullable="false"/>
            </column>
            <column name="cm_role_name" type="VARCHAR(${cmRoleNameLength})">
                <constraints nullable="false"/>
            </column>
            <column name="cm_user_role_state" type="VARCHAR(256)">
                <constraints nullable="false"/>
            </column>
        </createTable>
        <createTable tableName="acm_role">
            <column name="cm_role_name" type="VARCHAR(${cmRoleNameLength})">
                <constraints nullable="false"/>
            </column>
        </createTable>
        <addPrimaryKey tableName="acm_user" columnNames="cm_user_id, cm_user_directory_name"
                       constraintName="pk_acm_user_id"/>
        <addPrimaryKey tableName="acm_user_role" columnNames="cm_role_name, cm_user_id"
                       constraintName="pk_acm_user_role"/>
        <addPrimaryKey tableName="acm_role" columnNames="cm_role_name" constraintName="pk_acm_role_name"/>
    </changeSet>

    <changeSet id="02-user-service-drop-directory-name" author="dmiller">
        <dropPrimaryKey tableName="acm_user"/>
        <addPrimaryKey tableName="acm_user" columnNames="cm_user_id" constraintName="pk_acm_user"/>
    </changeSet>

    <changeSet id="03-add-first-and-last-name" author="dmiller">
        <addColumn tableName="acm_user">
            <column name="cm_first_name" type="VARCHAR(1024)"/>
            <column name="cm_last_name" type="VARCHAR(1024)"/>
        </addColumn>
        <createIndex tableName="acm_user" indexName="idx_user_last_name">
            <column name="cm_last_name"/>
        </createIndex>
    </changeSet>

    <changeSet id="04-user-service-add-role-type" author="dmiller">
        <addColumn tableName="acm_role">
            <column name="cm_role_type" type="VARCHAR(${cmValueLength})"/>
        </addColumn>
    </changeSet>

    <changeSet id="05-user-service-add-role-type-lookup-table" author="dmiller" dbms="oracle,postgresql,mssql">
        <createTable tableName="acm_role_type_lu">
            <column name="cm_id" type="${idType}">
                <constraints nullable="false" primaryKey="true" primaryKeyName="pk_role_type"/>
            </column>
            <column name="cm_value" type="VARCHAR(${cmValueLength})">
                <constraints nullable="false" unique="true" uniqueConstraintName="uk_role_type"/>
            </column>
            <column name="cm_order" type="NUMBER(32,0)">
                <constraints nullable="false" unique="true" uniqueConstraintName="uk_role_type_order"/>
            </column>
            <column name="cm_status" type="VARCHAR(128)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_created" type="${timestampType}">
                <constraints nullable="false"/>
            </column>
            <column name="cm_creator" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_modified" type="${timestampType}">
                <constraints nullable="false"/>
            </column>
            <column name="cm_modifier" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
        </createTable>

    </changeSet>

    <changeSet id="05-user-service-add-role-type-lookup-table" author="dmiller" dbms="mysql">
        <createTable tableName="acm_role_type_lu">
            <column name="cm_id" type="${idType}">
                <constraints nullable="false" primaryKey="true" primaryKeyName="pk_role_type"/>
            </column>
            <column name="cm_value" type="VARCHAR(${cmValueLength})">
                <constraints nullable="false" unique="true" uniqueConstraintName="uk_role_type"/>
            </column>
            <column name="cm_order" type="NUMBER(32,0)">
                <constraints nullable="false" unique="true" uniqueConstraintName="uk_role_type_order"/>
            </column>
            <column name="cm_status" type="VARCHAR(128)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_created" type="${timestampType}" defaultValueComputed="${timestampFunction}">
                <constraints nullable="false"/>
            </column>
            <column name="cm_creator" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_modified" type="${timestampType}" defaultValueComputed="${timestampFunction}">
                <constraints nullable="false"/>
            </column>
            <column name="cm_modifier" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
        </createTable>

    </changeSet>

    <changeSet id="06-role-type-notnull" author="dmiller">
        <addNotNullConstraint tableName="acm_role" columnName="cm_role_type" defaultNullValue="APPLICATION_ROLE"
                              columnDataType="VARCHAR(${cmValueLength})"/>
    </changeSet>

    <changeSet id="08-add-email-column-to-user-table" author="marst">
        <addColumn tableName="acm_user">
            <column name="cm_mail" type="VARCHAR(512)"/>
        </addColumn>
    </changeSet>

    <changeSet id="09-users-add-user-action-table" author="riste.tutureski" dbms="oracle,postgresql,mssql">
        <createTable tableName="acm_user_action">
            <column name="cm_user_action_id" type="${idType}">
                <constraints primaryKey="true" primaryKeyName="pk_cm_user_action"/>
            </column>
            <column name="cm_user_action_user_id" type="VARCHAR(${cmUserIdLength})">
                <constraints nullable="false"/>
            </column>
            <column name="cm_user_action_name" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_user_action_object_id" type="${fkIdType}">
                <constraints nullable="false"/>
            </column>
            <column name="cm_user_action_created" type="${timestampType}">
                <constraints nullable="false"/>
            </column>
            <column name="cm_user_action_creator" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_user_action_modified" type="${timestampType}">
                <constraints nullable="false"/>
            </column>
            <column name="cm_user_action_modifier" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
        </createTable>
        <addForeignKeyConstraint baseTableName="acm_user_action" baseColumnNames="cm_user_action_user_id"
                                 constraintName="fk_user_action_user_id" referencedTableName="acm_user"
                                 referencedColumnNames="cm_user_id"
                                 deferrable="${deferrable}" initiallyDeferred="${initially.deferred}"/>
    </changeSet>

    <changeSet id="09-users-add-user-action-table" author="riste.tutureski" dbms="mysql">
        <createTable tableName="acm_user_action">
            <column name="cm_user_action_id" type="${idType}">
                <constraints primaryKey="true" primaryKeyName="pk_cm_user_action"/>
            </column>
            <column name="cm_user_action_user_id" type="VARCHAR(${cmUserIdLength})">
                <constraints nullable="false"/>
            </column>
            <column name="cm_user_action_name" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_user_action_object_id" type="${fkIdType}">
                <constraints nullable="false"/>
            </column>
            <column name="cm_user_action_created" type="${timestampType}" defaultValueComputed="${timestampFunction}">
                <constraints nullable="false"/>
            </column>
            <column name="cm_user_action_creator" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_user_action_modified" type="${timestampType}" defaultValueComputed="${timestampFunction}">
                <constraints nullable="false"/>
            </column>
            <column name="cm_user_action_modifier" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
        </createTable>
        <addForeignKeyConstraint baseTableName="acm_user_action" baseColumnNames="cm_user_action_user_id"
                                 constraintName="fk_user_action_user_id" referencedTableName="acm_user"
                                 referencedColumnNames="cm_user_id"
                                 deferrable="${deferrable}" initiallyDeferred="${initially.deferred}"/>
    </changeSet>

    <changeSet id="10-create-group-table" author="riste.tutureski" dbms="oracle,postgresql,mssql">
        <createTable tableName="acm_group">
            <column name="cm_group_name" type="VARCHAR(${cmGroupNameLength})">
                <constraints primaryKey="true" primaryKeyName="pk_cm_group_name"/>
            </column>
            <column name="cm_group_parent_name" type="VARCHAR(${cmGroupNameLength})">
                <constraints nullable="true"/>
            </column>
            <column name="cm_group_description" type="VARCHAR(4000)">
                <constraints nullable="true"/>
            </column>
            <column name="cm_group_type" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_group_status" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_group_created" type="${timestampType}">
                <constraints nullable="false"/>
            </column>
            <column name="cm_group_creator" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_group_modified" type="${timestampType}">
                <constraints nullable="false"/>
            </column>
            <column name="cm_group_modifier" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
        </createTable>
        <addForeignKeyConstraint baseTableName="acm_group" baseColumnNames="cm_group_parent_name"
                                 constraintName="fk_group_parent_name"
                                 referencedTableName="acm_group" referencedColumnNames="cm_group_name"
                                 deferrable="${deferrable}"
                                 initiallyDeferred="${initially.deferred}"/>
    </changeSet>

    <changeSet id="10-create-group-table" author="riste.tutureski" dbms="mysql">
        <createTable tableName="acm_group">
            <column name="cm_group_name" type="VARCHAR(${cmGroupNameLength})">
                <constraints primaryKey="true" primaryKeyName="pk_cm_group_name"/>
            </column>
            <column name="cm_group_parent_name" type="VARCHAR(${cmGroupNameLength})">
                <constraints nullable="true"/>
            </column>
            <column name="cm_group_description" type="VARCHAR(4000)">
                <constraints nullable="true"/>
            </column>
            <column name="cm_group_type" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_group_status" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_group_created" type="${timestampType}" defaultValueComputed="${timestampFunction}">
                <constraints nullable="false"/>
            </column>
            <column name="cm_group_creator" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_group_modified" type="${timestampType}" defaultValueComputed="${timestampFunction}">
                <constraints nullable="false"/>
            </column>
            <column name="cm_group_modifier" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
        </createTable>
        <addForeignKeyConstraint baseTableName="acm_group" baseColumnNames="cm_group_parent_name"
                                 constraintName="fk_group_parent_name"
                                 referencedTableName="acm_group" referencedColumnNames="cm_group_name"
                                 deferrable="${deferrable}"
                                 initiallyDeferred="${initially.deferred}"/>
    </changeSet>

    <changeSet id="12-create-group-member-table" author="riste.tutureski">
        <createTable tableName="acm_group_member">
            <column name="cm_group_name" type="VARCHAR(${cmGroupNameLength})">
                <constraints nullable="false"/>
            </column>
            <column name="cm_user_id" type="VARCHAR(${cmUserIdLength})">
                <constraints nullable="false"/>
            </column>
        </createTable>
        <addForeignKeyConstraint baseTableName="acm_group_member" baseColumnNames="cm_group_name"
                                 constraintName="fk_group_member_group_name" referencedTableName="acm_group"
                                 referencedColumnNames="cm_group_name"
                                 deferrable="${deferrable}" initiallyDeferred="${initially.deferred}"/>

        <addForeignKeyConstraint baseTableName="acm_group_member" baseColumnNames="cm_user_id"
                                 constraintName="fk_group_member_user_id"
                                 referencedTableName="acm_user" referencedColumnNames="cm_user_id"
                                 deferrable="${deferrable}"
                                 initiallyDeferred="${initially.deferred}"/>
    </changeSet>

    <changeSet id="14-add-column-to-group-table" author="riste.tutureski">
        <addColumn tableName="acm_group">
            <column name="cm_group_supervisor_id" type="VARCHAR(${cmGroupSupervisorIdLength})">
                <constraints nullable="true"/>
            </column>
        </addColumn>
        <addForeignKeyConstraint baseTableName="acm_group" baseColumnNames="cm_group_supervisor_id"
                                 constraintName="fk_group_supervisor_id"
                                 referencedTableName="acm_user" referencedColumnNames="cm_user_id"
                                 deferrable="${deferrable}"
                                 initiallyDeferred="${initially.deferred}"/>
    </changeSet>

    <changeSet id="user-tables-15-add-group_member_primary_key" author="dmiller">
        <addPrimaryKey tableName="acm_group_member" columnNames="cm_group_name, cm_user_id"/>
    </changeSet>

    <changeSet id="user-tables-16-add-user-id-index" author="dmiller" dbms="oracle,postgresql,mssql">
        <createIndex tableName="ACM_USER" indexName="idx_lower_user_id">
            <column name="${lowerUserId}"/>
        </createIndex>
    </changeSet>

    <changeSet id="user-tables-16-add-user-id-index" author="dmiller" dbms="mysql">
        <!-- it seems MySQL table names are case sensitive :-( -->
        <createIndex tableName="acm_user" indexName="idx_lower_user_id">
            <column name="${lowerUserId}"/>
        </createIndex>
    </changeSet>

    <changeSet id="17-acm_role_type_lu-id" author="nebojsha.davidovikj">
        <createTable tableName="acm_role_type_lu_id">
            <column name="cm_seq_num" type="${idType}"/>
            <column name="cm_seq_name" type="VARCHAR(255)"/>
        </createTable>
        <insert tableName="acm_role_type_lu_id">
            <column name="cm_seq_num" value="100"></column>
            <column name="cm_seq_name" value="acm_role_type_lu"></column>
        </insert>
    </changeSet>
    <changeSet id="18-acm_user_action-id" author="nebojsha.davidovikj">
        <createTable tableName="acm_user_action_id">
            <column name="cm_seq_num" type="${idType}"/>
            <column name="cm_seq_name" type="VARCHAR(255)"/>
        </createTable>
        <insert tableName="acm_user_action_id">
            <column name="cm_seq_num" value="100"></column>
            <column name="cm_seq_name" value="acm_user_action"></column>
        </insert>
    </changeSet>

    <changeSet id="19-add-ldap-columns-to-user-table" author="bojan.milenkoski">
        <addColumn tableName="acm_user">
            <column name="cm_samaccountname" type="VARCHAR(20)"/>
            <column name="cm_user_principal_name" type="VARCHAR(255)"/>
            <column name="cm_distinguished_name" type="VARCHAR(255)"/>
        </addColumn>
    </changeSet>

    <changeSet id="20-add-uid-to-acm-user" author="david.miller">
        <addColumn tableName="acm_user">
            <column name="cm_uid" type="VARCHAR(255)"/>
        </addColumn>
    </changeSet>

    <changeSet id="21-add-ldap-columns-to-group-table" author="nadica.cuculova">
        <addColumn tableName="acm_group">
            <column name="cm_distinguished_name" type="VARCHAR(255)"/>
            <column name="cm_directory_name" type="VARCHAR(${cmUserDirectoryNameLength})" defaultValue="armedia">
                <constraints nullable="false"/>
            </column>
        </addColumn>
    </changeSet>

    <changeSet id="22-remove-directory-name-constraint" author="ilinpetar" dbms="mysql">
        <comment>Directory name is not applicable to ad-hoc groups</comment>
        <dropNotNullConstraint tableName="acm_group" columnName="cm_directory_name"
                               columnDataType="VARCHAR(${cmUserDirectoryNameLength})"/>
    </changeSet>

    <changeSet id="22-remove-directory-name-constraint" author="ilinpetar" dbms="oracle,postgresql,mssql">
        <comment>Directory name is not applicable to ad-hoc groups</comment>
        <dropNotNullConstraint tableName="acm_group" columnName="cm_directory_name"/>
    </changeSet>

    <changeSet id="23-add-country-department-company-attributes" author="manoj.dhungana" dbms="mssql,oracle,postgresql">
        <addColumn tableName="acm_user">
            <column name="cm_country" type="VARCHAR(255)"/>
            <column name="cm_department" type="VARCHAR(255)"/>
            <column name="cm_country_abbreviation" type="VARCHAR(255)"/>
            <column name="cm_company" type="VARCHAR(255)"/>
            <column name="cm_title" type="VARCHAR(255)"/>
        </addColumn>
    </changeSet>

    <changeSet id="23-add-country-department-company-attributes" author="manoj.dhungana" dbms="mysql">
        <addColumn tableName="acm_user">
            <column name="cm_country" type="TEXT"/>
            <column name="cm_department" type="TEXT"/>
            <column name="cm_country_abbreviation" type="TEXT"/>
            <column name="cm_company" type="TEXT"/>
            <column name="cm_title" type="TEXT"/>
        </addColumn>
    </changeSet>

    <changeSet id="24-added-deleted-at-column" author="jovan.ivanovski" dbms="mysql">
        <comment>New column for tracking when an AcmUser has been deleted</comment>
        <addColumn tableName="acm_user">
            <column name="cm_user_deleted_at" type="${timestampType}" defaultValueComputed="${timestampFunction}">
                <constraints nullable="false"/>
            </column>
        </addColumn>
    </changeSet>

    <changeSet id="24-added-deleted-at-column" author="jovan.ivanovski" dbms="mssql,oracle,postgresql">
        <comment>New column for tracking when an AcmUser has been deleted</comment>
        <addColumn tableName="acm_user">
            <column name="cm_user_deleted_at" type="TIMESTAMP" defaultValueComputed="${currentTime}">
                <constraints nullable="false"/>
            </column>
        </addColumn>
    </changeSet>

    <changeSet id="25-remove-constraint-on-deleted-at-column" author="jovan.ivanovski">
        <comment>Removed not null constraint on cm_user_deleted_at</comment>
        <dropNotNullConstraint tableName="acm_user" columnName="cm_user_deleted_at" columnDataType="${timestampType}"/>
    </changeSet>

    <changeSet id="26-add-password-expiration-date-column" author="ncuculova">
        <addColumn tableName="acm_user">
            <column name="cm_pwd_ex_date" type="DATE"/>
        </addColumn>
    </changeSet>

    <changeSet id="27-add-reset-password-token-column" author="ncuculova">
        <addColumn tableName="acm_user">
            <column name="cm_token_ex_date" type="${timestampType}"/>
            <column name="cm_token" type="VARCHAR(255)">
                <constraints unique="true" uniqueConstraintName="uk_token"/>
            </column>
        </addColumn>
    </changeSet>

    <changeSet id="28-add-group-display-name-column" author="marko.stojanoski" dbms="mssql,oracle,postgresql">
        <addColumn tableName="acm_group">
            <column name="cm_group_display_name" type="VARCHAR(255)"/>
        </addColumn>
    </changeSet>

    <changeSet id="28-add-group-display-name-column" author="marko.stojanoski" dbms="mysql">
        <addColumn tableName="acm_group">
            <column name="cm_group_display_name" type="TEXT"/>
        </addColumn>
    </changeSet>

    <changeSet id="28-add-user-lang-column" author="bojan.milenkoski">
        <addColumn tableName="acm_user">
            <column name="cm_lang" type="VARCHAR(10)" defaultValue="en">
                <constraints nullable="false"/>
            </column>
        </addColumn>
    </changeSet>

    <changeSet id="29-add-group-membership-table" author="ncuculova">
        <createTable tableName="acm_group_membership">
            <column name="cm_group_name" type="VARCHAR(${cmGroupNameLength})">
                <constraints nullable="false"/>
            </column>
            <column name="cm_member_group_name" type="VARCHAR(${cmGroupNameLength})">
                <constraints nullable="false"/>
            </column>
        </createTable>
    </changeSet>

    <changeSet id="30-rename_acm_group_member_table" author="ncuculova">
        <renameTable oldTableName="acm_group_member" newTableName="acm_user_membership"/>
    </changeSet>

    <changeSet id="31-add-group-ascendants-column" author="ncuculova">
        <addColumn tableName="acm_group">
            <column name="cm_ascendants" type="VARCHAR(4000)"/>
        </addColumn>
    </changeSet>

    <changeSet id="32-add-user-identifier-column" author="ncuculova">
        <addColumn tableName="acm_user">
            <column name="cm_identifier" type="${fkIdType}"/>
        </addColumn>
    </changeSet>

    <changeSet id="33-populate-user-identifier-column" author="ncuculova" dbms="mysql">
        <sql>
            SELECT @i:=100;
            UPDATE acm_user SET cm_identifier = @i:=@i+1;
        </sql>
    </changeSet>

    <changeSet id="33-populate-user-identifier-column" author="ncuculova" dbms="postgresql">
        <sql>
            UPDATE acm_user au SET cm_identifier = (r.num + 100) from
            (SELECT r.*, row_number() over () AS num FROM acm_user r) r
            where r.cm_user_id = au.cm_user_id;
        </sql>
    </changeSet>

    <changeSet id="33-populate-user-identifier-column" author="ncuculova" dbms="oracle">
        <sql>
            UPDATE acm_user set cm_identifier = rownum + 100;
        </sql>
    </changeSet>

    <changeSet id="33-populate-user-identifier-column" author="ncuculova" dbms="mssql">
        <sql>
            DECLARE @i INT
            SET @i=100
            UPDATE acm_user SET @i = cm_identifier = @i + 1
            GO
        </sql>
    </changeSet>

    <changeSet id="34-set-not-null-user-identifier-column" author="ncuculova">
        <addNotNullConstraint tableName="acm_user" columnName="cm_identifier" columnDataType="${fkIdType}"/>
    </changeSet>

    <changeSet id="35-add-user-identifier-table" author="ncuculova">
        <createTable tableName="acm_user_identifier">
            <column name="cm_id" type="${idType}">
                <constraints primaryKey="true" primaryKeyName="pk-user-id"/>
            </column>
        </createTable>
        <sql>
            INSERT INTO acm_user_identifier (cm_id)
            SELECT cm_identifier FROM acm_user;
        </sql>
    </changeSet>

    <changeSet id="36-add-group-identifier-column" author="ncuculova">
        <addColumn tableName="acm_group">
            <column name="cm_identifier" type="${fkIdType}"/>
        </addColumn>
    </changeSet>

    <changeSet id="37-populate-group-identifier-column" author="ncuculova" dbms="mysql">
        <sql>
            SELECT @i:=100;
            UPDATE acm_group SET cm_identifier = @i:=@i+1;
        </sql>
    </changeSet>

    <changeSet id="37-populate-group-identifier-column" author="ncuculova" dbms="postgresql">
        <sql>
            UPDATE acm_group SET cm_identifier = (r.num + 100) from
            (SELECT r.*, row_number() over () AS num FROM acm_group r) r
            where r.cm_group_name = acm_group.cm_group_name;
        </sql>
    </changeSet>

    <changeSet id="37-populate-group-identifier-column" author="ncuculova" dbms="oracle">
        <sql>
            UPDATE acm_group set cm_identifier = rownum + 100;
        </sql>
    </changeSet>

    <changeSet id="37-populate-group-identifier-column" author="ncuculova" dbms="mssql">
        <sql>
            DECLARE @i INT
            SET @i=100
            UPDATE acm_group SET @i = cm_identifier = @i + 1
            GO
        </sql>
    </changeSet>

    <changeSet id="38-set-not-null-group-identifier-column" author="ncuculova">
        <addNotNullConstraint tableName="acm_group" columnName="cm_identifier" columnDataType="${fkIdType}"/>
    </changeSet>

    <changeSet id="39-add-group-identifier-table" author="ncuculova">
        <createTable tableName="acm_group_identifier">
            <column name="cm_id" type="${idType}">
                <constraints primaryKey="true" primaryKeyName="pk-group-id"/>
            </column>
        </createTable>
        <sql>
            INSERT INTO acm_group_identifier (cm_id)
            SELECT cm_identifier FROM acm_group;
        </sql>
    </changeSet>

    <changeSet id="36-add-user-identifier-sec-table" author="ncuculova">
        <createTable tableName="acm_user_identifier_id">
            <column name="cm_seq_num" type="${idType}"/>
            <column name="cm_seq_name" type="VARCHAR(255)"/>
        </createTable>
        <insert tableName="acm_user_identifier_id">
            <column name="cm_seq_num" value="100"/>
            <column name="cm_seq_name" value="acm_user_identifier"/>
        </insert>
        <sql>
            UPDATE acm_user_identifier_id SET cm_seq_num = (SELECT max(cm_id) FROM acm_user_identifier);
        </sql>
    </changeSet>

    <changeSet id="37-add-group-identifier-sec-table" author="ncuculova">
        <createTable tableName="acm_group_identifier_id">
            <column name="cm_seq_num" type="${idType}"/>
            <column name="cm_seq_name" type="VARCHAR(255)"/>
        </createTable>
        <insert tableName="acm_group_identifier_id">
            <column name="cm_seq_num" value="100"/>
            <column name="cm_seq_name" value="acm_group_identifier"/>
        </insert>
        <sql>
            UPDATE acm_group_identifier_id SET cm_seq_num = (SELECT max(cm_id) FROM acm_group_identifier);
        </sql>
    </changeSet>

    <changeSet id="38-set-seq-num-in-acm-user-identifier-if-null" author="ncuculova">
        <sql>
            UPDATE acm_user_identifier_id SET cm_seq_num = 100 WHERE cm_seq_num IS NULL;
        </sql>
    </changeSet>

    <changeSet id="39-set-seq-num-in-acm-group-identifier-if-null" author="ncuculova">
        <sql>
            UPDATE acm_group_identifier_id SET cm_seq_num = 100 WHERE cm_seq_num IS NULL;
        </sql>
    </changeSet>

    <changeSet id="40-create-acm_user_access_token-table" author="ncuculova" dbms="mysql">
        <createTable tableName="acm_user_access_token">
            <column name="cm_id" type="${idType}">
                <constraints primaryKey="true" primaryKeyName="pk_access_token"/>
            </column>
            <column name="cm_value" type="TEXT">
                <constraints nullable="false"/>
            </column>
            <column name="cm_user_email" type="VARCHAR(128)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_expiration_in_sec" type="LONG">
                <constraints nullable="false"/>
            </column>
            <column name="cm_provider" type="VARCHAR(128)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_created_date_time" type="${timestampType}">
                <constraints nullable="false"/>
            </column>
        </createTable>
        <addUniqueConstraint tableName="acm_user_access_token" columnNames="cm_user_email,cm_provider"/>
    </changeSet>

    <changeSet id="02-create-acm_user_access_token-table" author="ncuculova" dbms="oracle,postgresql,mssql">
        <createTable tableName="acm_user_access_token">
            <column name="cm_id" type="${idType}">
                <constraints primaryKey="true" primaryKeyName="pk_access_token"/>
            </column>
            <column name="cm_value" type="VARCHAR(2560)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_user_email" type="VARCHAR(128)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_expiration_in_sex" type="LONG">
                <constraints nullable="false"/>
            </column>
            <column name="cm_provider" type="VARCHAR(128)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_created_date_time" type="${timestampType}">
                <constraints nullable="false"/>
            </column>
        </createTable>
        <addUniqueConstraint tableName="acm_user_access_token" columnNames="cm_user_email,cm_provider"/>
    </changeSet>

    <changeSet id="03-create-acm_user_access_token-index" author="ncuculova">
        <createIndex tableName="acm_user_access_token" indexName="idx_access_token_value">
            <column name="cm_value"/>
        </createIndex>
    </changeSet>

    <changeSet id="04-create-acm_user_access_token-seq" author="ncuculova">
        <createTable tableName="acm_user_access_token_id">
            <column name="cm_seq_num" type="${idType}"/>
            <column name="cm_seq_name" type="VARCHAR(255)"/>
        </createTable>
        <insert tableName="acm_user_access_token_id">
            <column name="cm_seq_num" value="100"></column>
            <column name="cm_seq_name" value="acm_user_access_token"></column>
        </insert>
    </changeSet>

    <changeSet id="05-add-user-id-token-to-acm_user_access_token" author="aleksandar.acevski" dbms="mysql">
        <addColumn tableName="acm_user_access_token">
            <column name="cm_user_id_token" type="TEXT">
                <constraints nullable="false"/>
            </column>
        </addColumn>
    </changeSet>

    <changeSet id="05-add-user-id-token-to-acm_user_access_token" author="aleksandar.acevski"
               dbms="oracle,postgresql,mssql">
        <addColumn tableName="acm_user_access_token">
            <column name="cm_user_id_token" type="VARCHAR(2560)">
                <constraints nullable="false"/>
            </column>
        </addColumn>
    </changeSet>

    <changeSet id="06-rename-email-column-to-tenant-acm_user_access_token" author="aleksandar.acevski">
        <renameColumn tableName="acm_user_access_token" oldColumnName="cm_user_email" newColumnName="cm_tenant"
                      columnDataType="VARCHAR(128)"/>
    </changeSet>

    <changeSet id="07-drop-non-null-constraint-to-user-id-token" author="aleksandar.acevski" dbms="mysql">
        <dropNotNullConstraint tableName="acm_user_access_token" columnName="cm_user_id_token" columnDataType="TEXT"/>
    </changeSet>

    <changeSet id="07-drop-non-null-constraint-to-user-id-token" author="aleksandar.acevski"
               dbms="oracle,postgresql,mssql">
        <dropNotNullConstraint tableName="acm_user_access_token" columnName="cm_user_id_token"
                               columnDataType="VARCHAR(2560)"/>
    </changeSet>

    <changeSet id="08-change-cm-role-type-lu-datetime" author="marija.blazhevska">
        <modifyDataType tableName="acm_role_type_lu" columnName="cm_created" newDataType="DATETIME"/>
        <modifyDataType tableName="acm_role_type_lu" columnName="cm_modified" newDataType="DATETIME"/>
    </changeSet>

    <changeSet id="09-change-cm-user-access-datetime" author="marija.blazhevska">
        <modifyDataType tableName="acm_user_access_token" columnName="cm_created_date_time" newDataType="DATETIME"/>
    </changeSet>

    <changeSet id="10-change-cm-user-action-datetime" author="marija.blazhevska">
        <modifyDataType tableName="acm_user_action" columnName="cm_user_action_created" newDataType="DATETIME"/>
        <modifyDataType tableName="acm_user_action" columnName="cm_user_action_modified" newDataType="DATETIME"/>
    </changeSet>

</databaseChangeLog>
