All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.datastax.driver.core.schemabuilder.CreateIndex Maven / Gradle / Ivy

/*
 *      Copyright (C) 2012-2015 DataStax Inc.
 *
 *   Licensed under the Apache License, Version 2.0 (the "License");
 *   you may not use this file except in compliance with the License.
 *   You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *   Unless required by applicable law or agreed to in writing, software
 *   distributed under the License is distributed on an "AS IS" BASIS,
 *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *   See the License for the specific language governing permissions and
 *   limitations under the License.
 */
package com.datastax.driver.core.schemabuilder;

import com.datastax.driver.$internal.com.google.common.base.Optional;

import static com.datastax.driver.core.schemabuilder.SchemaStatement.*;

/**
 * A built CREATE INDEX statement.
 */
public class CreateIndex implements StatementStart {

    private String indexName;
    private boolean ifNotExists = false;
    private Optional keyspaceName = Optional.absent();
    private String tableName;
    private String columnName;
    private boolean keys;

    CreateIndex(String indexName) {
        validateNotEmpty(indexName, "Index name");
        validateNotKeyWord(indexName, String.format("The index name '%s' is not allowed because it is a reserved keyword", indexName));
        this.indexName = indexName;
    }

    /**
     * Add the 'IF NOT EXISTS' condition to this CREATE INDEX statement.
     *
     * @return this CREATE INDEX statement.
     */
    public CreateIndex ifNotExists() {
        this.ifNotExists = true;
        return this;
    }

    /**
     * Specify the keyspace and table to create the index on.
     *
     * @param keyspaceName the keyspace name.
     * @param tableName    the table name.
     * @return a {@link CreateIndexOn} that will allow the specification of the column.
     */
    public CreateIndexOn onTable(String keyspaceName, String tableName) {
        validateNotEmpty(keyspaceName, "Keyspace name");
        validateNotEmpty(tableName, "Table name");
        validateNotKeyWord(keyspaceName, String.format("The keyspace name '%s' is not allowed because it is a reserved keyword", keyspaceName));
        validateNotKeyWord(tableName, String.format("The table name '%s' is not allowed because it is a reserved keyword", tableName));
        this.keyspaceName = Optional.fromNullable(keyspaceName);
        this.tableName = tableName;
        return new CreateIndexOn();
    }

    /**
     * Specify the table to create the index on.
     *
     * @param tableName the table name.
     * @return a {@link CreateIndexOn} that will allow the specification of the column.
     */
    public CreateIndexOn onTable(String tableName) {
        validateNotEmpty(tableName, "Table name");
        validateNotKeyWord(tableName, String.format("The table name '%s' is not allowed because it is a reserved keyword", tableName));
        this.tableName = tableName;
        return new CreateIndexOn();
    }

    public class CreateIndexOn {
        /**
         * Specify the column to create the index on.
         *
         * @param columnName the column name.
         * @return the final CREATE INDEX statement.
         */
        public SchemaStatement andColumn(String columnName) {
            validateNotEmpty(columnName, "Column name");
            validateNotKeyWord(columnName, String.format("The column name '%s' is not allowed because it is a reserved keyword", columnName));
            CreateIndex.this.columnName = columnName;
            return SchemaStatement.fromQueryString(buildInternal());
        }

        /**
         * Create an index on the keys of the given map column.
         *
         * @param columnName the column name.
         * @return the final CREATE INDEX statement.
         */
        public SchemaStatement andKeysOfColumn(String columnName) {
            validateNotEmpty(columnName, "Column name");
            validateNotKeyWord(columnName, String.format("The column name '%s' is not allowed because it is a reserved keyword", columnName));
            CreateIndex.this.columnName = columnName;
            CreateIndex.this.keys = true;
            return SchemaStatement.fromQueryString(buildInternal());
        }
    }

    @Override
    public String buildInternal() {
        StringBuilder createStatement = new StringBuilder(STATEMENT_START).append("CREATE INDEX ");

        if (ifNotExists) {
            createStatement.append("IF NOT EXISTS ");
        }

        createStatement.append(indexName).append(" ON ");

        if (keyspaceName.isPresent()) {
            createStatement.append(keyspaceName.get()).append(".");
        }
        createStatement.append(tableName);

        createStatement.append("(");
        if (keys) {
            createStatement.append("KEYS(");
        }

        createStatement.append(columnName);

        if (keys) {
            createStatement.append(")");
        }
        createStatement.append(")");

        return createStatement.toString();
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy