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

de.svws_nrw.db.schema.SchemaTabelleIndex Maven / Gradle / Ivy

Go to download

Diese Bibliothek regelt den Zugriff auf Datenbanken für die Schulverwaltungssoftware in NRW

The newest version!
package de.svws_nrw.db.schema;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

import de.svws_nrw.db.DBDriver;

/**
 * Diese Klasse dient der Definition eines Index bei SVWS-Datenbank-Tabellen.
 */
public class SchemaTabelleIndex {

	/** Die Tabelle, der dieser Index zugeordnet ist */
	private final SchemaTabelle _tabelle;

	/** Der Name der Spalte */
	private final String _name;

	/** Die Spalten, die zu diesem Index gehören */
	private final List _spalten;

	/** Die Revision, ab wann die Spalte gültig ist. */
	private SchemaRevisionen _revision;

	/** Die Revision, ab wann die Spalte veraltet ist, sofern sie veraltet ist, ansonsten {@link SchemaRevisionen#UNDEFINED} */
	private SchemaRevisionen _veraltet;


	/**
	 * Erstellt einen neuen Index mit dem übergebenen Namen und den übergebenen
	 * Spalten.
	 *
	 * @param tab       die Tabelle, der diese Index zugeordnet ist.
	 * @param name      der Name des Index
	 * @param spalten   die Spalten des Index
	 */
	SchemaTabelleIndex(final SchemaTabelle tab, final String name, final SchemaTabelleSpalte... spalten) {
		this._tabelle = tab;
		this._name = name;
		this._spalten = Arrays.stream(spalten).toList();
		this._revision = tab.revision();
		this._veraltet = tab.veraltet();
	}


	/**
	 * Setzt die Revision, ab wann der Index gültig ist. Dabei wird
	 * der übernommene Wert von der Tabelle überschrieben.
	 *
	 * @param revision   die Revision
	 *
	 * @return dieses Objekt
	 */
	public SchemaTabelleIndex setRevision(final SchemaRevisionen revision) {
		if (revision == SchemaRevisionen.UNDEFINED)
			throw new RuntimeException("Die Revision eines Index kann nicht auf undefiniert gesetzt werden.");
		if (revision.revision <= this._revision.revision)
			throw new RuntimeException("Die Revision eines Index kann nur Überschrieben werden, wenn die Revision größer ist als die,"
					+ " welche bei der Tabelle gesetzt ist.");
		this._revision = revision;
		return this;
	}

	/**
	 * Setzt die Revision, ab wann der Index veraltet ist. Dabei wird
	 * der übernommene Wert von der Tabelle überschrieben.
	 *
	 * @param veraltet   die Revision
	 *
	 * @return dieses Objekt
	 */
	public SchemaTabelleIndex setVeraltet(final SchemaRevisionen veraltet) {
		if (veraltet == SchemaRevisionen.UNDEFINED)
			throw new RuntimeException("Die Revision, wann ein Index veraltet, kann nicht auf undefiniert gesetzt werden, da in diesem Fall"
					+ " das Erben des Veraltet-Attributes der Tabelle vorrangig ist.");
		if ((this._veraltet != SchemaRevisionen.UNDEFINED) && (veraltet.revision >= this._veraltet.revision))
			throw new RuntimeException("Die Revision, wann ein Index veraltet, kann nicht auf eine Revision größer oder gleich der Revision gesetzt werden,"
					+ " wo die zugehörige Tabelle veraltet.");
		this._veraltet = veraltet;
		return this;
	}

	/**
	 * Gibt die Tabelle zurück, der dieser Index zugeordnet ist.
	 *
	 * @return die Tabelle
	 */
	public SchemaTabelle tabelle() {
		return _tabelle;
	}

	/**
	 * Gibt den Namen des Index zurück.
	 *
	 * @return der Name des Index
	 */
	public String name() {
		return _name;
	}

	/**
	 * Gibt die Spalten des Index zurück.
	 *
	 * @return die Spalten des Index
	 */
	public List spalten() {
		return _spalten;
	}

	/**
	 * Gibt die Revision zurück, ab wann der Index gültig ist.
	 *
	 * @return die Revision
	 */
	public SchemaRevisionen revision() {
		return _revision;
	}

	/**
	 * Gibt die Revision zurück, ab wann der Index veraltet ist.
	 * Ist er nicht veraltet, so wird {@link SchemaRevisionen#UNDEFINED}
	 * zurückgegeben.
	 *
	 * @return die Revision, ab wann der Index veraltet ist, oder {@link SchemaRevisionen#UNDEFINED}
	 */
	public SchemaRevisionen veraltet() {
		return _veraltet;
	}


	/**
	 * Liefert die Tabellenspalten des Index in der durch das Feld Sortierung definierten Reihenfolge
	 *
	 * @return die Tabellenspalten des Index in der durch das Feld Sortierung definierten Reihenfolge
	 */
	public List getSpalten() {
		return _spalten.stream().sorted((a, b) -> Integer.compare(a.sortierung(), b.sortierung())).toList();
	}


	/**
	 * Erstellt einen SQL-String für das Erstellen eines Index
	 *
	 * @return der SQL-String für das Erstellen des Index
	 */
	public String getSQL() {
		return "CREATE INDEX " + this._name + " ON " + this._tabelle.name() + '('
				+ getSpalten().stream().map(spalte -> spalte.name()).collect(Collectors.joining(", "))
				+ ");";
	}


	/**
	 * Erzeugt den SQL-Drop-Befehl für diesen Index für den SQL-Dialekt des angegebenen DBMS
	 *
	 * @param dbms   das DBMS
	 *
	 * @return der SQL-Drop-Befehl
	 */
	public String getSQLDrop(final DBDriver dbms) {
		return switch (dbms) {
			case SQLITE -> "DROP INDEX IF EXISTS " + this._name + ";";
			case MARIA_DB, MYSQL -> "ALTER TABLE " + this._tabelle.name() + " DROP INDEX " + this._name + ';';
			case MDB -> "DROP INDEX " + this._name + " ON " + this._tabelle.name() + ";";
			case MSSQL -> "DROP INDEX " + this._tabelle.name() + "." + this._name + ";";
			default -> "ALTER TABLE " + this._tabelle.name() + " DROP INDEX " + this._name + ';';
		};
	}

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy