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

com.speedment.runtime.config.ForeignKeyColumn Maven / Gradle / Ivy

Go to download

A Speedment bundle that shades all dependencies into one jar. This is useful when deploying an application on a server.

The newest version!
/*
 *
 * Copyright (c) 2006-2019, Speedment, Inc. All Rights Reserved.
 *
 * 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.speedment.runtime.config;

import com.speedment.runtime.config.internal.ForeignKeyColumnImpl;
import com.speedment.runtime.config.mutator.DocumentMutator;
import com.speedment.runtime.config.mutator.ForeignKeyColumnMutator;
import com.speedment.runtime.config.trait.HasColumn;
import com.speedment.runtime.config.trait.HasDeepCopy;
import com.speedment.runtime.config.trait.HasId;
import com.speedment.runtime.config.trait.HasMainInterface;
import com.speedment.runtime.config.trait.HasMutator;
import com.speedment.runtime.config.trait.HasName;
import com.speedment.runtime.config.trait.HasOrdinalPosition;
import com.speedment.runtime.config.trait.HasParent;
import com.speedment.runtime.config.util.DocumentUtil;

import java.util.Optional;

import static com.speedment.runtime.config.util.DocumentUtil.newNoSuchElementExceptionFor;

/**
 * A typed {@link Document} that represents the column referenced by a foreign
 * key instance in the database. A {@code ForeignKeyColumn} is located inside a
 * {@link ForeignKey}.
 *
 * @author  Emil Forslund
 * @since   2.0.0
 */
public interface ForeignKeyColumn extends
    Document,
    HasParent,
    HasDeepCopy,
    HasId,    
    HasName,
    HasOrdinalPosition,
    HasColumn,
    HasMainInterface,
    HasMutator> {

    /**
     * Returns the name of the foreign database referenced by this column.
     * 
     * @return the name of the foreign database
     */
    default String getForeignDatabaseName() {
    	return getAsString(ForeignKeyColumnUtil.FOREIGN_DATABASE_NAME)
    			.orElseThrow(newNoSuchElementExceptionFor(this, ForeignKeyColumnUtil.FOREIGN_DATABASE_NAME));
    }
    
    /**
     * Returns the name of the foreign schema(depends on DBMS type) referenced by this column.
     * 
     * @return the name of the foreign schema
     */
    default String getForeignSchemaName() {
    	return getAsString(ForeignKeyColumnUtil.FOREIGN_SCHEMA_NAME)
    			.orElseThrow(newNoSuchElementExceptionFor(this, ForeignKeyColumnUtil.FOREIGN_SCHEMA_NAME));
    }
    
    /**
     * Returns the name of the foreign column referenced by this column.
     *
     * @return the name of the foreign column
     */
    default String getForeignTableName() {
        return getAsString(ForeignKeyColumnUtil.FOREIGN_TABLE_NAME)
            .orElseThrow(newNoSuchElementExceptionFor(this, ForeignKeyColumnUtil.FOREIGN_TABLE_NAME));
    }

    /**
     * Returns the name of the foreign table referenced by this column.
     *
     * @return the name of the foreign table
     */
    default String getForeignColumnName() {
        return getAsString(ForeignKeyColumnUtil.FOREIGN_COLUMN_NAME)
            .orElseThrow(newNoSuchElementExceptionFor(this, ForeignKeyColumnUtil.FOREIGN_COLUMN_NAME));
    }

    /**
     * A helper method for accessing the foreign {@link Table} referenced by
     * this key.
     *
     * @return the foreign {@link Table} referenced by this
     */
    default Optional findForeignTable() {
        final Optional schema = ancestors()
            .filter(Schema.class::isInstance)
            .map(Schema.class::cast)
            .findFirst();

        return schema.flatMap(s -> s.tables()
            .filter(tab -> tab.getId().equals(getForeignTableName()))
            .findAny()
        );
    }

    /**
     * A helper method for accessing the foreign {@link Column} referenced by
     * this key.
     *
     * @return the foreign {@link Column} referenced by this
     */
    default Optional findForeignColumn() {
        return findForeignTable()
            .flatMap(table -> table.columns()
                .filter(col -> col.getId().equals(getForeignColumnName()))
                .findAny()
            );
    }

    @Override
    default Class mainInterface() {
        return ForeignKeyColumn.class;
    }

    @Override
    default ForeignKeyColumnMutator mutator() {
        return DocumentMutator.of(this);
    }

    @Override
    default ForeignKeyColumn deepCopy() {
        return DocumentUtil.deepCopy(this, ForeignKeyColumnImpl::new);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy