/* * JBoss, Home of Professional Open Source. * See the COPYRIGHT.txt file distributed with this work for information * regarding copyright ownership. Some portions may be licensed * to Red Hat, Inc. under one or more contributor license agreements. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA. */ package org.teiid.metadata; import java.util.Collection; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import org.teiid.translator.ExecutionFactory; import org.teiid.translator.TranslatorException; /** * This class is being provided for sole reason to inject metadata as it used to be in previous * teiid versions. Take a look at modified interface of the MetadataRepostiory interface. * * If a {@link DefaultMetadataRepository} is used, it will inject metadata onto whatever has been * loaded at that point in the repository chain. Generally this means that a {@link DefaultMetadataRepository} * should be last. */ @SuppressWarnings("unused") @Deprecated public abstract class DefaultMetadataRepository<F, C> extends MetadataRepository<F, C> { /** * Calls the specific getter methods of this class to populate metadata on schema being loaded. * If this method is overriden, the super method must be called to perform the metadata injection. */ public void loadMetadata(MetadataFactory factory, ExecutionFactory<F,C> executionFactory, F connectionFactory) throws TranslatorException { String vdbName = factory.getVdbName(); String vdbVersion = factory.getVdbVersion(); Collection<AbstractMetadataRecord> records = new LinkedHashSet<AbstractMetadataRecord>(); this.startLoadVdb(vdbName, vdbVersion); Schema schema = factory.getSchema(); records.add(schema); for (Table t : schema.getTables().values()) { records.add(t); records.addAll(t.getColumns()); records.addAll(t.getAllKeys()); if (t.isPhysical()) { TableStats stats = this.getTableStats(vdbName, vdbVersion, t); if (stats != null) { t.setTableStats(stats); } for (Column c : t.getColumns()) { ColumnStats cStats = this.getColumnStats(vdbName, vdbVersion, c); if (cStats != null) { c.setColumnStats(cStats); } } } else { String def = this.getViewDefinition(vdbName, vdbVersion, t); if (def != null) { t.setSelectTransformation(def); } if (t.supportsUpdate()) { def = this.getInsteadOfTriggerDefinition(vdbName, vdbVersion, t, Table.TriggerEvent.INSERT); if (def != null) { t.setInsertPlan(def); } Boolean enabled = this.isInsteadOfTriggerEnabled(vdbName, vdbVersion, t, Table.TriggerEvent.INSERT); if (enabled != null) { t.setInsertPlanEnabled(enabled); } def = this.getInsteadOfTriggerDefinition(vdbName, vdbVersion, t, Table.TriggerEvent.UPDATE); if (def != null) { t.setUpdatePlan(def); } enabled = this.isInsteadOfTriggerEnabled(vdbName, vdbVersion, t, Table.TriggerEvent.UPDATE); if (enabled != null) { t.setUpdatePlanEnabled(enabled); } def = this.getInsteadOfTriggerDefinition(vdbName, vdbVersion, t, Table.TriggerEvent.DELETE); if (def != null) { t.setDeletePlan(def); } enabled = this.isInsteadOfTriggerEnabled(vdbName, vdbVersion, t, Table.TriggerEvent.DELETE); if (enabled != null) { t.setDeletePlanEnabled(enabled); } } } } for (Procedure p : schema.getProcedures().values()) { records.add(p); records.addAll(p.getParameters()); if (p.getResultSet() != null) { records.addAll(p.getResultSet().getColumns()); } if (p.isVirtual() && !p.isFunction()) { String proc = this.getProcedureDefinition(vdbName, vdbVersion, p); if (proc != null) { p.setQueryPlan(proc); } } } for (AbstractMetadataRecord abstractMetadataRecord : records) { LinkedHashMap<String, String> p = this.getProperties(vdbName, vdbVersion, abstractMetadataRecord); if (p != null) { abstractMetadataRecord.setProperties(p); } } this.endLoadVdb(vdbName, vdbVersion); } /** * Marks the start of vdb metadata loading * Note: this is called for every schema * @param vdbName * @param vdbVersion */ public void startLoadVdb(String vdbName, String vdbVersion) { } /** * Marks the end of vdb metadata loading * Note: this is called for every schema * @param vdbName * @param vdbVersion */ public void endLoadVdb(String vdbName, String vdbVersion) { } /** * Get updated {@link ColumnStats} for the given column * @param vdbName * @param vdbVersion * @param column * @return the stats. a null result or a null stat indicates that the default should be used */ public ColumnStats getColumnStats(String vdbName, String vdbVersion, Column column) { return null; } /** * Returns an updated trigger definition (FOR EACH ROW ...) or null if the current view definition should be used * should be used. */ public String getInsteadOfTriggerDefinition(String vdbName, String vdbVersion, Table table, Table.TriggerEvent triggerOperation) { return null; } /** * Returns an updated procedure definition (CREATE PROCEDURE ...) or null if the current procedure definition should be used * should be used. */ public String getProcedureDefinition(String vdbName, String vdbVersion, Procedure procedure) { return null; } /** * Get updated {@link TableStats} for the given table * @param vdbName * @param vdbVersion * @param table * @return the stats. a null result or a null stat indicates that the current value should be used */ public TableStats getTableStats(String vdbName, String vdbVersion, Table table) { return null; } /** * Returns an updated view definition (AS SQL only) or null if the current view definition should be used * should be used. */ public String getViewDefinition(String vdbName, String vdbVersion, Table table) { return null; } /** * Get the extension metadata for a given record. * @param vdbName * @param vdbVersion * @param record * @return */ public LinkedHashMap<String, String> getProperties(String vdbName, String vdbVersion, AbstractMetadataRecord record){ return null; } /** * Returns whether the trigger is enabled * @param vdbName * @param vdbVersion * @param table * @param triggerOperation * @return */ public Boolean isInsteadOfTriggerEnabled(String vdbName, String vdbVersion, Table table, Table.TriggerEvent triggerOperation) { return null; } }