/*
 * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0,
 * or the Eclipse Distribution License v. 1.0 which is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 */

// Contributors:
//     Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.testing.models.multipletable;

import org.eclipse.persistence.tools.schemaframework.*;

/**
 * Creates the necessary tables for the MultipleTableProject.
 *
 * @author Guy Pelletier
 * @version 1.0
 * @date June 17, 2005
 */
public class MultipleTableTableCreator extends TableCreator {
    public MultipleTableTableCreator() {
        setName("MultipleTableTableCreator");

        addTableDefinition(buildCOWTable());
        addTableDefinition(buildCALFSTable());
        addTableDefinition(buildCOW_AGETable());
        addTableDefinition(buildCOW_WEIGHTTable());
        addTableDefinition(buildSUPER_COWTable());

        addTableDefinition(buildHORSETable());
        addTableDefinition(buildFOALSTable());
        addTableDefinition(buildHORSE_AGETable());
        addTableDefinition(buildHORSE_WEIGHTTable());
        addTableDefinition(buildSUPER_HORSETable());

        addTableDefinition(buildHUMANTable());
        addTableDefinition(buildKIDSTable());

        addTableDefinition(buildSWANTable());
        addTableDefinition(buildCYGNETSTable());
        addTableDefinition(buildSWAN_AGETable());
        addTableDefinition(buildSWAN_WEIGHTTable());
        addTableDefinition(buildSUPER_SWANTable());
        addTableDefinition(buildSWAN_WINGSPANTable());
    }

    protected TableDefinition buildCOWTable() {
        TableDefinition table = new TableDefinition();
        table.setName("MULTI_COW");

        FieldDefinition field = new FieldDefinition();
        field.setName("ID");
        field.setTypeName("NUMERIC");
        field.setSize(15);
        field.setShouldAllowNull(false);
        field.setIsPrimaryKey(true);
        field.setUnique(false);
        field.setIsIdentity(false);
        table.addField(field);

        FieldDefinition typeField = new FieldDefinition();
        typeField.setName("TYPE");
        typeField.setTypeName("VARCHAR");
        typeField.setSize(3);
        typeField.setShouldAllowNull(true);
        typeField.setIsPrimaryKey(false);
        typeField.setUnique(false);
        typeField.setIsIdentity(false);
        table.addField(typeField);

        FieldDefinition field1 = new FieldDefinition();
        field1.setName("CALFS_ID");
        field1.setTypeName("NUMERIC");
        field1.setSize(15);
        field1.setShouldAllowNull(false);
        field1.setIsPrimaryKey(false);
        field1.setUnique(false);
        field1.setIsIdentity(false);
        table.addField(field1);

        FieldDefinition field2 = new FieldDefinition();
        field2.setName("NAME");
        field2.setTypeName("VARCHAR");
        field2.setSize(40);
        field2.setShouldAllowNull(true);
        field2.setIsPrimaryKey(false);
        field2.setUnique(false);
        field2.setIsIdentity(false);
        table.addField(field2);

        FieldDefinition field3 = new FieldDefinition();
        field3.setName("AGE_ID");
        field3.setTypeName("NUMERIC");
        field3.setSize(15);
        field3.setShouldAllowNull(false);
        field3.setIsPrimaryKey(false);
        field3.setUnique(false);
        field3.setIsIdentity(false);
        table.addField(field3);

        FieldDefinition field4 = new FieldDefinition();
        field4.setName("WEIGHT_ID");
        field4.setTypeName("NUMERIC");
        field4.setSize(15);
        field4.setShouldAllowNull(false);
        field4.setIsPrimaryKey(false);
        field4.setUnique(false);
        field4.setIsIdentity(false);
        table.addField(field4);

        ForeignKeyConstraint foreignKeyCOW_CALFS = new ForeignKeyConstraint();
        foreignKeyCOW_CALFS.setName("COW_CALFS");
        foreignKeyCOW_CALFS.setTargetTable("MULTI_CALFS");
        foreignKeyCOW_CALFS.addSourceField("CALFS_ID");
        foreignKeyCOW_CALFS.addTargetField("C_ID");
        table.addForeignKeyConstraint(foreignKeyCOW_CALFS);

        ForeignKeyConstraint foreignKeyCOW_AGE = new ForeignKeyConstraint();
        foreignKeyCOW_AGE.setName("COW_AGE");
        foreignKeyCOW_AGE.setTargetTable("MULTI_COW_AGE");
        foreignKeyCOW_AGE.addSourceField("AGE_ID");
        foreignKeyCOW_AGE.addTargetField("A_ID");
        table.addForeignKeyConstraint(foreignKeyCOW_AGE);

        ForeignKeyConstraint foreignKeyCOW_WEIGHT = new ForeignKeyConstraint();
        foreignKeyCOW_WEIGHT.setName("COW_WEIGHT");
        foreignKeyCOW_WEIGHT.setTargetTable("MULTI_COW_WEIGHT");
        foreignKeyCOW_WEIGHT.addSourceField("WEIGHT_ID");
        foreignKeyCOW_WEIGHT.addTargetField("W_ID");
        table.addForeignKeyConstraint(foreignKeyCOW_WEIGHT);

        return table;
    }

    protected TableDefinition buildCALFSTable() {
        TableDefinition table = new TableDefinition();
        table.setName("MULTI_CALFS");

        FieldDefinition field = new FieldDefinition();
        field.setName("C_ID");
        field.setTypeName("NUMERIC");
        field.setSize(15);
        field.setShouldAllowNull(false);
        field.setIsPrimaryKey(true);
        field.setUnique(false);
        field.setIsIdentity(false);
        table.addField(field);

        FieldDefinition field1 = new FieldDefinition();
        field1.setName("CALFS");
        field1.setTypeName("NUMERIC");
        field1.setSize(10);
        field1.setShouldAllowNull(true);
        field1.setIsPrimaryKey(false);
        field1.setUnique(false);
        field1.setIsIdentity(false);
        table.addField(field1);

        return table;
    }

    protected TableDefinition buildCOW_AGETable() {
        TableDefinition table = new TableDefinition();
        table.setName("MULTI_COW_AGE");

        FieldDefinition field = new FieldDefinition();
        field.setName("A_ID");
        field.setTypeName("NUMERIC");
        field.setSize(15);
        field.setShouldAllowNull(false);
        field.setIsPrimaryKey(true);
        field.setUnique(false);
        field.setIsIdentity(false);
        table.addField(field);

        FieldDefinition field1 = new FieldDefinition();
        field1.setName("AGE");
        field1.setTypeName("NUMERIC");
        field1.setSize(10);
        field1.setShouldAllowNull(true);
        field1.setIsPrimaryKey(false);
        field1.setUnique(false);
        field1.setIsIdentity(false);
        table.addField(field1);

        return table;
    }

    protected TableDefinition buildCOW_WEIGHTTable() {
        TableDefinition table = new TableDefinition();
        table.setName("MULTI_COW_WEIGHT");

        FieldDefinition field = new FieldDefinition();
        field.setName("W_ID");
        field.setTypeName("NUMERIC");
        field.setSize(15);
        field.setShouldAllowNull(false);
        field.setIsPrimaryKey(true);
        field.setUnique(false);
        field.setIsIdentity(false);
        table.addField(field);

        FieldDefinition field1 = new FieldDefinition();
        field1.setName("WEIGHT");
        field1.setTypeName("NUMERIC");
        field1.setSize(10);
        field1.setShouldAllowNull(true);
        field1.setIsPrimaryKey(false);
        field1.setUnique(false);
        field1.setIsIdentity(false);
        table.addField(field1);

        return table;
    }

    protected TableDefinition buildSUPER_COWTable() {
        TableDefinition table = new TableDefinition();
        table.setName("MULTI_SUPER_COW");

        FieldDefinition field = new FieldDefinition();
        field.setName("SC_ID");
        field.setTypeName("NUMERIC");
        field.setSize(15);
        field.setShouldAllowNull(false);
        field.setIsPrimaryKey(true);
        field.setUnique(false);
        field.setIsIdentity(false);
        field.setForeignKeyFieldName("MULTI_COW.ID");
        table.addField(field);

        FieldDefinition sppedField = new FieldDefinition();
        sppedField.setName("SPEED");
        sppedField.setTypeName("NUMERIC");
        sppedField.setSize(15);
        sppedField.setShouldAllowNull(false);
        sppedField.setIsPrimaryKey(false);
        sppedField.setUnique(false);
        sppedField.setIsIdentity(false);
        table.addField(sppedField);

        return table;
    }

    protected TableDefinition buildHORSETable() {
        TableDefinition table = new TableDefinition();
        table.setName("MULTI_HORSE");

        FieldDefinition field = new FieldDefinition();
        field.setName("ID");
        field.setTypeName("NUMERIC");
        field.setSize(15);
        field.setShouldAllowNull(false);
        field.setIsPrimaryKey(true);
        field.setUnique(false);
        field.setIsIdentity(false);
        table.addField(field);

        FieldDefinition typeField = new FieldDefinition();
        typeField.setName("TYPE");
        typeField.setTypeName("VARCHAR");
        typeField.setSize(3);
        typeField.setShouldAllowNull(true);
        typeField.setIsPrimaryKey(false);
        typeField.setUnique(false);
        typeField.setIsIdentity(false);
        table.addField(typeField);

        FieldDefinition field1 = new FieldDefinition();
        field1.setName("NAME");
        field1.setTypeName("VARCHAR");
        field1.setSize(40);
        field1.setShouldAllowNull(true);
        field1.setIsPrimaryKey(false);
        field1.setUnique(false);
        field1.setIsIdentity(false);
        table.addField(field1);

        return table;
    }

    protected TableDefinition buildFOALSTable() {
        TableDefinition table = new TableDefinition();
        table.setName("MULTI_FOALS");

        FieldDefinition field = new FieldDefinition();
        field.setName("F_HORSE_ID");
        field.setTypeName("NUMERIC");
        field.setSize(15);
        field.setShouldAllowNull(false);
        field.setIsPrimaryKey(true);
        field.setUnique(false);
        field.setIsIdentity(true);
        table.addField(field);

        FieldDefinition field1 = new FieldDefinition();
        field1.setName("FOALS");
        field1.setTypeName("NUMERIC");
        field1.setSize(10);
        field1.setShouldAllowNull(true);
        field1.setIsPrimaryKey(false);
        field1.setUnique(false);
        field1.setIsIdentity(false);
        table.addField(field1);

        ForeignKeyConstraint foreignKeyFOALS_HORSE = new ForeignKeyConstraint();
        foreignKeyFOALS_HORSE.setName("FOALS_HORSE");
        foreignKeyFOALS_HORSE.setTargetTable("MULTI_HORSE");
        foreignKeyFOALS_HORSE.addSourceField("F_HORSE_ID");
        foreignKeyFOALS_HORSE.addTargetField("ID");
        table.addForeignKeyConstraint(foreignKeyFOALS_HORSE);

        return table;
    }

    protected TableDefinition buildHORSE_AGETable() {
        TableDefinition table = new TableDefinition();
        table.setName("MULTI_HORSE_AGE");

        FieldDefinition field = new FieldDefinition();
        field.setName("A_HORSE_ID");
        field.setTypeName("NUMERIC");
        field.setSize(15);
        field.setShouldAllowNull(false);
        field.setIsPrimaryKey(true);
        field.setUnique(false);
        field.setIsIdentity(false);
        table.addField(field);

        FieldDefinition field1 = new FieldDefinition();
        field1.setName("AGE");
        field1.setTypeName("NUMERIC");
        field1.setSize(10);
        field1.setShouldAllowNull(true);
        field1.setIsPrimaryKey(false);
        field1.setUnique(false);
        field1.setIsIdentity(false);
        table.addField(field1);

        ForeignKeyConstraint foreignKeyHORSE_AGE = new ForeignKeyConstraint();
        foreignKeyHORSE_AGE.setName("AGE_HORSE");
        foreignKeyHORSE_AGE.setTargetTable("MULTI_HORSE");
        foreignKeyHORSE_AGE.addSourceField("A_HORSE_ID");
        foreignKeyHORSE_AGE.addTargetField("ID");
        table.addForeignKeyConstraint(foreignKeyHORSE_AGE);

        return table;
    }

    protected TableDefinition buildHORSE_WEIGHTTable() {
        TableDefinition table = new TableDefinition();
        table.setName("MULTI_HORSE_WEIGHT");

        FieldDefinition field = new FieldDefinition();
        field.setName("W_HORSE_ID");
        field.setTypeName("NUMERIC");
        field.setSize(15);
        field.setShouldAllowNull(false);
        field.setIsPrimaryKey(true);
        field.setUnique(false);
        field.setIsIdentity(false);
        table.addField(field);

        FieldDefinition field1 = new FieldDefinition();
        field1.setName("WEIGHT");
        field1.setTypeName("NUMERIC");
        field1.setSize(10);
        field1.setShouldAllowNull(true);
        field1.setIsPrimaryKey(false);
        field1.setUnique(false);
        field1.setIsIdentity(false);
        table.addField(field1);

        ForeignKeyConstraint foreignKeyHORSE_WEIGHT = new ForeignKeyConstraint();
        foreignKeyHORSE_WEIGHT.setName("WEIGHT_HORSE");
        foreignKeyHORSE_WEIGHT.setTargetTable("MULTI_HORSE");
        foreignKeyHORSE_WEIGHT.addSourceField("W_HORSE_ID");
        foreignKeyHORSE_WEIGHT.addTargetField("ID");
        table.addForeignKeyConstraint(foreignKeyHORSE_WEIGHT);

        return table;
    }

    protected TableDefinition buildSUPER_HORSETable() {
        TableDefinition table = new TableDefinition();
        table.setName("MULTI_SUPER_HORSE");

        FieldDefinition field = new FieldDefinition();
        field.setName("SH_ID");
        field.setTypeName("NUMERIC");
        field.setSize(15);
        field.setShouldAllowNull(false);
        field.setIsPrimaryKey(true);
        field.setUnique(false);
        field.setIsIdentity(false);
        field.setForeignKeyFieldName("MULTI_HORSE.ID");
        table.addField(field);

        FieldDefinition sppedField = new FieldDefinition();
        sppedField.setName("SPEED");
        sppedField.setTypeName("NUMERIC");
        sppedField.setSize(15);
        sppedField.setShouldAllowNull(false);
        sppedField.setIsPrimaryKey(false);
        sppedField.setUnique(false);
        sppedField.setIsIdentity(false);
        table.addField(sppedField);

        return table;
    }

    protected TableDefinition buildHUMANTable() {
        TableDefinition table = new TableDefinition();
        table.setName("MULTI_HUMAN");

        FieldDefinition field = new FieldDefinition();
        field.setName("ID");
        field.setTypeName("NUMERIC");
        field.setSize(15);
        field.setShouldAllowNull(false);
        field.setIsPrimaryKey(true);
        field.setUnique(false);
        field.setIsIdentity(false);
        table.addField(field);

        FieldDefinition field1 = new FieldDefinition();
        field1.setName("NAME");
        field1.setTypeName("VARCHAR");
        field1.setSize(40);
        field1.setShouldAllowNull(true);
        field1.setIsPrimaryKey(false);
        field1.setUnique(false);
        field1.setIsIdentity(false);
        table.addField(field1);

        return table;
    }

    protected TableDefinition buildKIDSTable() {
        TableDefinition table = new TableDefinition();
        table.setName("MULTI_KIDS");

        FieldDefinition field = new FieldDefinition();
        field.setName("ID");
        field.setTypeName("NUMERIC");
        field.setSize(15);
        field.setShouldAllowNull(false);
        field.setIsPrimaryKey(true);
        field.setUnique(false);
        field.setIsIdentity(false);
        table.addField(field);

        FieldDefinition field1 = new FieldDefinition();
        field1.setName("KIDS");
        field1.setTypeName("NUMERIC");
        field1.setSize(10);
        field1.setShouldAllowNull(true);
        field1.setIsPrimaryKey(false);
        field1.setUnique(false);
        field1.setIsIdentity(false);
        table.addField(field1);

        ForeignKeyConstraint foreignKeyKIDS_HUMAN = new ForeignKeyConstraint();
        foreignKeyKIDS_HUMAN.setName("KIDS_HUMAN");
        foreignKeyKIDS_HUMAN.setTargetTable("MULTI_HUMAN");
        foreignKeyKIDS_HUMAN.addSourceField("ID");
        foreignKeyKIDS_HUMAN.addTargetField("ID");
        table.addForeignKeyConstraint(foreignKeyKIDS_HUMAN);

        return table;
    }

    protected TableDefinition buildSWANTable() {
        TableDefinition table = new TableDefinition();
        table.setName("MULTI_SWAN");

        FieldDefinition field = new FieldDefinition();
        field.setName("ID");
        field.setTypeName("NUMERIC");
        field.setSize(15);
        field.setShouldAllowNull(false);
        field.setIsPrimaryKey(true);
        field.setUnique(false);
        field.setIsIdentity(false);
        table.addField(field);

        FieldDefinition typeField = new FieldDefinition();
        typeField.setName("TYPE");
        typeField.setTypeName("VARCHAR");
        typeField.setSize(3);
        typeField.setShouldAllowNull(true);
        typeField.setIsPrimaryKey(false);
        typeField.setUnique(false);
        typeField.setIsIdentity(false);
        table.addField(typeField);

        FieldDefinition field1 = new FieldDefinition();
        field1.setName("NAME");
        field1.setTypeName("VARCHAR");
        field1.setSize(40);
        field1.setShouldAllowNull(true);
        field1.setIsPrimaryKey(false);
        field1.setUnique(false);
        field1.setIsIdentity(false);
        table.addField(field1);

        ForeignKeyConstraint foreignKeySWAN_CYGNET = new ForeignKeyConstraint();
        foreignKeySWAN_CYGNET.setName("SWAN_CYGNET");
        foreignKeySWAN_CYGNET.setTargetTable("MULTI_CYGNETS");
        foreignKeySWAN_CYGNET.addSourceField("ID");
        foreignKeySWAN_CYGNET.addTargetField("C_SWAN_ID");
        table.addForeignKeyConstraint(foreignKeySWAN_CYGNET);

        return table;
    }

    protected TableDefinition buildCYGNETSTable() {
        TableDefinition table = new TableDefinition();
        table.setName("MULTI_CYGNETS");

        FieldDefinition field = new FieldDefinition();
        field.setName("C_SWAN_ID");
        field.setTypeName("NUMERIC");
        field.setSize(15);
        field.setShouldAllowNull(false);
        field.setIsPrimaryKey(true);
        field.setUnique(false);
        field.setIsIdentity(false);
        table.addField(field);

        FieldDefinition field1 = new FieldDefinition();
        field1.setName("CYGNETS");
        field1.setTypeName("NUMERIC");
        field1.setSize(10);
        field1.setShouldAllowNull(true);
        field1.setIsPrimaryKey(false);
        field1.setUnique(false);
        field1.setIsIdentity(false);
        table.addField(field1);

        return table;
    }

    protected TableDefinition buildSWAN_AGETable() {
        TableDefinition table = new TableDefinition();
        table.setName("MULTI_SWAN_AGE");

        FieldDefinition field = new FieldDefinition();
        field.setName("A_SWAN_ID");
        field.setTypeName("NUMERIC");
        field.setSize(15);
        field.setShouldAllowNull(false);
        field.setIsPrimaryKey(true);
        field.setUnique(false);
        field.setIsIdentity(false);
        table.addField(field);

        FieldDefinition field1 = new FieldDefinition();
        field1.setName("AGE");
        field1.setTypeName("NUMERIC");
        field1.setSize(10);
        field1.setShouldAllowNull(true);
        field1.setIsPrimaryKey(false);
        field1.setUnique(false);
        field1.setIsIdentity(false);
        table.addField(field1);

        ForeignKeyConstraint foreignKeySWAN_AGE = new ForeignKeyConstraint();
        foreignKeySWAN_AGE.setName("AGE_SWAN");
        foreignKeySWAN_AGE.setTargetTable("MULTI_SWAN");
        foreignKeySWAN_AGE.addSourceField("A_SWAN_ID");
        foreignKeySWAN_AGE.addTargetField("ID");
        table.addForeignKeyConstraint(foreignKeySWAN_AGE);

        return table;
    }

    protected TableDefinition buildSWAN_WINGSPANTable() {
        TableDefinition table = new TableDefinition();
        table.setName("MULTI_SWAN_WINGSPAN");

        FieldDefinition field = new FieldDefinition();
        field.setName("A_SWAN_ID");
        field.setTypeName("NUMERIC");
        field.setSize(15);
        field.setShouldAllowNull(false);
        field.setIsPrimaryKey(true);
        field.setUnique(false);
        field.setIsIdentity(false);
        table.addField(field);

        FieldDefinition field1 = new FieldDefinition();
        field1.setName("WING_SPAN");
        field1.setTypeName("NUMERIC");
        field1.setSize(10);
        field1.setShouldAllowNull(true);
        field1.setIsPrimaryKey(false);
        field1.setUnique(false);
        field1.setIsIdentity(false);
        table.addField(field1);

        ForeignKeyConstraint foreignKeySWAN_WING_SPAN = new ForeignKeyConstraint();
        foreignKeySWAN_WING_SPAN.setName("WING_SPAN");
        foreignKeySWAN_WING_SPAN.setTargetTable("MULTI_SUPER_SWAN");
        foreignKeySWAN_WING_SPAN.addSourceField("A_SWAN_ID");
        foreignKeySWAN_WING_SPAN.addTargetField("SS_ID");
        table.addForeignKeyConstraint(foreignKeySWAN_WING_SPAN);

        return table;
    }

    protected TableDefinition buildSWAN_WEIGHTTable() {
        TableDefinition table = new TableDefinition();
        table.setName("MULTI_SWAN_WEIGHT");

        FieldDefinition field = new FieldDefinition();
        field.setName("W_SWAN_ID");
        field.setTypeName("NUMERIC");
        field.setSize(15);
        field.setShouldAllowNull(false);
        field.setIsPrimaryKey(true);
        field.setUnique(false);
        field.setIsIdentity(false);
        table.addField(field);

        FieldDefinition field1 = new FieldDefinition();
        field1.setName("WEIGHT");
        field1.setTypeName("NUMERIC");
        field1.setSize(10);
        field1.setShouldAllowNull(true);
        field1.setIsPrimaryKey(false);
        field1.setUnique(false);
        field1.setIsIdentity(false);
        table.addField(field1);

        ForeignKeyConstraint foreignKeySWAN_WEIGHT = new ForeignKeyConstraint();
        foreignKeySWAN_WEIGHT.setName("WIGHT_SWAN");
        foreignKeySWAN_WEIGHT.setTargetTable("MULTI_SWAN");
        foreignKeySWAN_WEIGHT.addSourceField("W_SWAN_ID");
        foreignKeySWAN_WEIGHT.addTargetField("ID");
        table.addForeignKeyConstraint(foreignKeySWAN_WEIGHT);

        return table;
    }

    protected TableDefinition buildSUPER_SWANTable() {
        TableDefinition table = new TableDefinition();
        table.setName("MULTI_SUPER_SWAN");

        FieldDefinition field = new FieldDefinition();
        field.setName("SS_ID");
        field.setTypeName("NUMERIC");
        field.setSize(15);
        field.setShouldAllowNull(false);
        field.setIsPrimaryKey(true);
        field.setUnique(false);
        field.setIsIdentity(false);
        field.setForeignKeyFieldName("MULTI_SWAN.ID");
        table.addField(field);

        FieldDefinition sppedField = new FieldDefinition();
        sppedField.setName("SPEED");
        sppedField.setTypeName("NUMERIC");
        sppedField.setSize(15);
        sppedField.setShouldAllowNull(false);
        sppedField.setIsPrimaryKey(false);
        sppedField.setUnique(false);
        sppedField.setIsIdentity(false);
        table.addField(sppedField);

        return table;
    }
}
