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

org.droitateddb.builder.schema.writer.ToManyAssociationWriter Maven / Gradle / Ivy

/*
 * Copyright (C) 2014 The droitated DB Authors
 *
 * 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 org.droitateddb.builder.schema.writer;

import org.droitateddb.schema.SchemaConstants;
import org.droitateddb.util.Pair;

import java.util.Locale;

import static org.droitateddb.builder.Constants.CONSTANT_ATTRIBUTE_ARRAY;
import static org.droitateddb.builder.Constants.CONSTANT_PREFIX;
import static org.droitateddb.builder.Constants.CONSTANT_STRING;
import static org.droitateddb.builder.Constants.CONSTANT_STRING_ARRAY;
import static org.droitateddb.builder.Constants.TAB;
import static java.lang.String.format;

/**
 * @author Alexander Frank
 * @author Falk Appel
 */
public class ToManyAssociationWriter implements Writer {

	private final String indent;
	private final String tableName;
	private final String simpleLeft;
	private final String simpleLeftLower;
	private final String canonicalLeft;
	private final String simpleRight;
	private final String simpleRightLower;
	private final String canonicalRight;

	public ToManyAssociationWriter(final String indent, final Pair link) {
		this.indent = indent;

		canonicalLeft = link.getFirst();
		simpleLeft = getSimpleName(canonicalLeft);
		simpleLeftLower = simpleLeft.toLowerCase(Locale.getDefault());
		canonicalRight = link.getSecond();
		simpleRight = getSimpleName(canonicalRight);
		simpleRightLower = simpleRight.toLowerCase(Locale.getDefault());

		tableName = simpleLeft + simpleRight + SchemaConstants.LINK;
	}

	@Override
	public String write() {
		StringBuilder builder = new StringBuilder();
		addDefinition(builder);
		addTableName(builder);
		addAttribute(builder, canonicalLeft, simpleLeftLower, 0, SchemaConstants.FROM_SUFFIX);
		addAttribute(builder, canonicalRight, simpleRightLower, 1, SchemaConstants.TO_SUFFIX);
		builder.append("\n");
		addSqlStatement(builder);
		addProjection(builder);
		addAttributes(builder);
		addEnd(builder);
		return builder.toString();
	}

	private void addDefinition(final StringBuilder builder) {
		builder.append(indent).append("public interface ").append(simpleLeft).append(simpleRight).append(SchemaConstants.LINK).append(" {\n");
	}

	private void addTableName(final StringBuilder builder) {
		builder.append(indent).append(TAB).append(String.format(CONSTANT_STRING, SchemaConstants.TABLE_NAME, tableName));
		builder.append("\n");
	}

	private void addAttribute(final StringBuilder builder, final String canonicalName, final String simpleName, final int idx, final String suffix) {
		String fkToUpper = (SchemaConstants.FOREIGN_KEY + simpleName + suffix).toUpperCase(Locale.getDefault());

		builder.append(indent).append(TAB).append(CONSTANT_PREFIX).append("IntegerAttribute ").append(fkToUpper).append(" = ") //
				.append("new IntegerAttribute(") //
				.append("\"").append("\", \"") //
				.append(SchemaConstants.FOREIGN_KEY + simpleName + suffix).append("\", ")//
				.append(canonicalName).append(".class, ") //
				.append(idx).append(");\n");

	}

	private void addSqlStatement(final StringBuilder builder) {
		String fromColumn = SchemaConstants.FOREIGN_KEY + simpleLeftLower + SchemaConstants.FROM_SUFFIX;
		String toColumn = SchemaConstants.FOREIGN_KEY + simpleRightLower + SchemaConstants.TO_SUFFIX;

		StringBuilder statement = new StringBuilder("CREATE TABLE ");
		statement.append(tableName).append("(");
		statement.append(fromColumn).append(" Integer, ");
		statement.append(toColumn).append(" Integer, ");
		statement.append("UNIQUE(").append(fromColumn).append(", ").append(toColumn).append(") ON CONFLICT IGNORE)");

		builder.append(indent).append(TAB).append(format(CONSTANT_STRING, SchemaConstants.SQL_CREATION, statement.toString()));

		builder.append(indent).append(TAB).append(createIndexStatement(tableName, fromColumn));
		builder.append(indent).append(TAB).append(createIndexStatement(tableName, toColumn));
	}

	private String createIndexStatement(String tableName, String columnName) {
		String lowerColumnName = columnName.toLowerCase();

		StringBuilder index = new StringBuilder("CREATE INDEX ");
		index.append(tableName.toLowerCase()).append("_").append(lowerColumnName).append(SchemaConstants.INDEX_SUFFIX);
		index.append(" on ").append(tableName).append(" (");
		index.append(columnName);
		index.append(")");
		return format(CONSTANT_STRING, SchemaConstants.SQL_INDEX + "_" + lowerColumnName, index.toString());
	}

	private void addProjection(final StringBuilder builder) {
		StringBuilder projection = new StringBuilder();
		projection.append("\"").append(SchemaConstants.FOREIGN_KEY).append(simpleLeftLower + SchemaConstants.FROM_SUFFIX).append("\", ") //
				.append("\"").append(SchemaConstants.FOREIGN_KEY).append(simpleRightLower + SchemaConstants.TO_SUFFIX).append("\"");
		builder.append(indent).append(TAB).append(format(CONSTANT_STRING_ARRAY, SchemaConstants.PROJECTION, projection.toString()));
	}

	private void addAttributes(final StringBuilder builder) {
		StringBuilder concat = new StringBuilder();
		concat.append((SchemaConstants.FOREIGN_KEY + simpleLeft + SchemaConstants.FROM_SUFFIX).toUpperCase(Locale.getDefault())).append(", ") //
				.append((SchemaConstants.FOREIGN_KEY + simpleRight + SchemaConstants.TO_SUFFIX).toUpperCase(Locale.getDefault()));

		builder.append(indent).append(TAB).append(format(CONSTANT_ATTRIBUTE_ARRAY, SchemaConstants.ATTRIBUTES, concat.toString()));
	}

	private void addEnd(final StringBuilder builder) {
		builder.append(indent).append("}\n");
	}

	private String getSimpleName(final String canonical) {
		int lastDot = canonical.lastIndexOf(".");
		return canonical.substring(lastDot + 1, canonical.length());
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy