/* * 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.deployers; import java.io.Serializable; import java.util.List; import java.util.Map; import java.util.TreeMap; import org.teiid.adminapi.impl.VDBMetaData; import org.teiid.api.exception.query.QueryMetadataException; import org.teiid.common.buffer.BufferManager; import org.teiid.core.TeiidComponentException; import org.teiid.core.TeiidProcessingException; import org.teiid.logging.LogConstants; import org.teiid.logging.LogManager; import org.teiid.query.ObjectReplicator; import org.teiid.query.metadata.QueryMetadataInterface; import org.teiid.query.metadata.TempMetadataID; import org.teiid.query.metadata.TransformationMetadata; import org.teiid.query.optimizer.relational.RelationalPlanner; import org.teiid.query.sql.symbol.GroupSymbol; import org.teiid.query.tempdata.GlobalTableStore; import org.teiid.query.tempdata.GlobalTableStoreImpl; import org.teiid.query.tempdata.GlobalTableStoreImpl.MatTableInfo; import org.teiid.query.tempdata.TempTable; import org.teiid.runtime.RuntimePlugin; public class CompositeGlobalTableStore implements GlobalTableStore { public static GlobalTableStore createInstance(CompositeVDB vdb, BufferManager bufferManager, ObjectReplicator replicator) { VDBMetaData vdbMetadata = vdb.getVDB(); QueryMetadataInterface metadata = vdbMetadata.getAttachment(TransformationMetadata.class); GlobalTableStore gts = new GlobalTableStoreImpl(bufferManager, vdbMetadata, metadata); if (replicator != null) { try { gts = replicator.replicate(vdbMetadata.getFullName(), GlobalTableStore.class, gts, 300000); } catch (Exception e) { LogManager.logError(LogConstants.CTX_RUNTIME, e, RuntimePlugin.Util.gs(RuntimePlugin.Event.TEIID40088, gts)); } } if (vdb.getChildren() == null) { return gts; } TreeMap<String, GlobalTableStore> stores = new TreeMap<String, GlobalTableStore>(String.CASE_INSENSITIVE_ORDER); buildStoreMap(vdb, stores); return new CompositeGlobalTableStore(stores, gts, metadata); } static void buildStoreMap(CompositeVDB vdb, TreeMap<String, GlobalTableStore> stores) { for (CompositeVDB cvdb : vdb.getChildren().values()) { VDBMetaData child = cvdb.getVDB(); GlobalTableStore childGts = child.getAttachment(GlobalTableStore.class); if (cvdb.getChildren() != null) { buildStoreMap(cvdb, stores); } for (String name : child.getModelMetaDatas().keySet()) { if (cvdb.getChildren() == null || !child.getImportedModels().contains(name)) { stores.put(name, childGts); } } } } private Map<String, GlobalTableStore> stores; private GlobalTableStore primary; private QueryMetadataInterface metadata; public CompositeGlobalTableStore(Map<String, GlobalTableStore> stores, GlobalTableStore primary, QueryMetadataInterface metadata) { this.stores = stores; this.primary = primary; this.metadata = metadata; } @Override public TempMetadataID getGlobalTempTableMetadataId(Object groupID) throws TeiidComponentException, TeiidProcessingException { Object mid = metadata.getModelID(groupID); String name = metadata.getName(mid); return getStore(name).getGlobalTempTableMetadataId(groupID); } @Override public TempMetadataID getGlobalTempTableMetadataId(String matTableName) { return getStoreForTable(matTableName).getGlobalTempTableMetadataId(matTableName); } @Override public TempMetadataID getCodeTableMetadataId(String codeTableName, String returnElementName, String keyElementName, String matTableName) throws TeiidComponentException, QueryMetadataException { return getStoreForTable(matTableName).getCodeTableMetadataId(codeTableName, returnElementName, keyElementName, matTableName); } @Override public MatTableInfo getMatTableInfo(String matTableName) { return getStoreForTable(matTableName).getMatTableInfo(matTableName); } @Override public TempTable getTempTable(String matTableName) { return getStoreForTable(matTableName).getTempTable(matTableName); } @Override public Serializable getAddress() { return primary.getAddress(); } @Override public List<?> updateMatViewRow(String matTableName, List<?> tuple, boolean delete) throws TeiidComponentException { return getStoreForTable(matTableName).updateMatViewRow(matTableName, tuple, delete); } @Override public TempTable createMatTable(String matTableName, GroupSymbol group) throws TeiidComponentException, QueryMetadataException, TeiidProcessingException { return getStoreForTable(matTableName).createMatTable(matTableName, group); } @Override public void failedLoad(String matTableName) { getStoreForTable(matTableName).failedLoad(matTableName); } @Override public boolean needsLoading(String matTableName, Serializable loadingAddress, boolean firstPass, boolean refresh, boolean invalidate) { return getStoreForTable(matTableName).needsLoading(matTableName, loadingAddress, firstPass, refresh, invalidate); } @Override public void loaded(String matTableName, TempTable table) { getStoreForTable(matTableName).loaded(matTableName, table); } GlobalTableStore getStoreForTable(String matTableName) { String name = matTableName.substring(RelationalPlanner.MAT_PREFIX.length(), matTableName.length()); name = name.substring(0, name.indexOf('.')); return getStore(name); } GlobalTableStore getStore(String name) { GlobalTableStore store = stores.get(name); if (store == null) { return primary; } return store; } GlobalTableStore getPrimary() { return primary; } }