CreateTableDDL.java 2.72 KB
package fi.codecrew.moya.sql;

import java.util.ArrayList;
import java.util.List;

/**
 * CREATE TABLE tableName
 */
public class CreateTableDDL {

    private final String tableName;
    private final boolean ifNotExists;
    private final List<Field> tableFields;

    public CreateTableDDL(String tableName) {
        this.tableName = tableName;
        this.ifNotExists = false;
        this.tableFields = new ArrayList<Field>();
    }

    public CreateTableDDL(String tableName, boolean iFNotExists) {
        this.tableName = tableName;
        this.ifNotExists = iFNotExists;
        this.tableFields = new ArrayList<Field>();
    }

    CreateTableDDL(String tableName, boolean ifNotExists, List<Field> fields) {
        this.tableName = tableName;
        this.ifNotExists = ifNotExists;
        this.tableFields = new ArrayList<Field>(fields);
    }

    private CreateTableDDL withNewField(Field field) {
        ArrayList<Field> newFieldSet = new ArrayList<Field>(tableFields.size() + 1);
        newFieldSet.addAll(tableFields);
        newFieldSet.add(field);
        return new CreateTableDDL(tableName, ifNotExists, newFieldSet);
    }

    private String fieldsString() {
        String[] strs = new String[tableFields.size()];
        for (int i = 0; i<strs.length; i++) {
            strs[i] = tableFields.get(i).toString();
        }
        return String.join(", ", strs);
    }

    @Override
    public String toString() {
        return String.join(" ", "CREATE TABLE", tableName, "(" + fieldsString() + ");");
    }

    public CreateTableDDL serialPK(String name) {
        return withNewField(new Field(name, "serial", false, "PRIMARY KEY"));
    }

    public CreateTableDDL integerField(String name, boolean nullable, String... params) {
        return withNewField(new Field(name, "integer", nullable, params));
    }

    public CreateTableDDL reference(String name, boolean nullable, String targetTable) {
        return withNewField(new Field(name, "integer", nullable, "REFERENCES", targetTable));
    }

    public CreateTableDDL reference(String name, boolean nullable, String targetTable, String targetColumn) {
        return withNewField(new Field(name, "integer", nullable, "REFERENCES", targetTable, "(" + targetColumn + ")"));
    }

    public CreateTableDDL text(String name, boolean nullable, String... params) {
        return withNewField(new Field(name, "text", nullable, params));
    }

    public CreateTableDDL timestampTZ(String name, boolean nullable, String... params) {
        return withNewField(new Field(name, "timestamptz", nullable, params));
    }

    public CreateTableDDL field(String name, String type, boolean nullable, String... params) {
        return withNewField(new Field(name, type, nullable, params));
    }
}