/*
* 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.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import org.teiid.metadata.AbstractMetadataRecord.DataModifiable;
import org.teiid.metadata.AbstractMetadataRecord.Modifiable;
public class Table extends ColumnSet<Schema> implements Modifiable, DataModifiable {
public static final int UNKNOWN_CARDINALITY = -1;
private static final long serialVersionUID = 4891356771125218672L;
public enum Type {
Table,
View,
Document,
XmlMappingClass,
XmlStagingTable,
MaterializedTable,
/** Temporary from a Teiid Perspective - will not have a parent set */
TemporaryTable {
@Override
public String toString() {
return "TEMPORARY TABLE"; //$NON-NLS-1$
}
}
}
/**
* TriggerEvent Types
*/
public static enum TriggerEvent {
/**
* Insert event
*/
INSERT,
/**
* Update event
*/
UPDATE,
/**
* Delete event
*/
DELETE
}
static final int asInt(long f) {
if (f == UNKNOWN_CARDINALITY || f < 0) {
return UNKNOWN_CARDINALITY;
} else if (f <= Integer.MAX_VALUE) {
return (int)f;
}
//NaN 0x7ffffffff will map to -1 (unknown)
return Float.floatToRawIntBits(f) | 0x80000000;
}
static final float asFloat(int i) {
if (i >= UNKNOWN_CARDINALITY) {
return i;
}
return Float.intBitsToFloat(i & 0x7fffffff);
}
private volatile int cardinality = UNKNOWN_CARDINALITY;
private Type tableType;
private boolean isVirtual;
private boolean isSystem;
private boolean isMaterialized;
private boolean supportsUpdate;
private List<ForeignKey> foriegnKeys = new ArrayList<ForeignKey>(2);
private List<KeyRecord> indexes = new ArrayList<KeyRecord>(2);
private List<KeyRecord> functionBasedIndexes = new ArrayList<KeyRecord>(2);
private List<KeyRecord> uniqueKeys = new ArrayList<KeyRecord>(2);
private List<KeyRecord> accessPatterns = new ArrayList<KeyRecord>(2);
private KeyRecord primaryKey;
//view information
private volatile String selectTransformation;
private volatile String insertPlan;
private volatile String updatePlan;
private volatile String deletePlan;
private volatile boolean insertPlanEnabled;
private volatile boolean updatePlanEnabled;
private volatile boolean deletePlanEnabled;
private Table materializedStageTable;
private Table materializedTable;
//XML specific
private List<String> bindings;
private List<String> schemaPaths;
private String resourcePath;
private volatile transient long lastModified;
private volatile transient long lastDataModification;
/**
* Used in xml document models mapping classes to represent input parameters
* @return
*/
public List<String> getBindings() {
return bindings;
}
public void setBindings(List<String> bindings) {
this.bindings = bindings;
}
/**
* If the table represents an xml document model with associated schemas in the vdb, this
* will return a list of the file paths
* @return
*/
public List<String> getSchemaPaths() {
return schemaPaths;
}
public void setSchemaPaths(List<String> schemaPaths) {
this.schemaPaths = schemaPaths;
}
public int getCardinality() {
if (cardinality >= UNKNOWN_CARDINALITY) {
return cardinality;
}
return Integer.MAX_VALUE;
}
public float getCardinalityAsFloat() {
return asFloat(cardinality);
}
public boolean isVirtual() {
return isVirtual;
}
public boolean isMaterialized() {
return isMaterialized;
}
public boolean isPhysical() {
return !isVirtual();
}
public boolean isSystem() {
return isSystem;
}
public Type getTableType() {
if (tableType == null) {
return Type.Table;
}
return tableType;
}
public boolean supportsUpdate() {
return supportsUpdate;
}
/**
* @param i
*/
public void setCardinality(int i) {
cardinality = asInt(i);
}
public void setCardinality(long f) {
cardinality = asInt(f);
}
/**
* @param i
*/
public void setTableType(Type i) {
tableType = i;
}
/**
* @param b
*/
public void setSupportsUpdate(boolean b) {
supportsUpdate = b;
}
/**
* @param b
*/
public void setVirtual(boolean b) {
isVirtual = b;
}
/**
* @param isMaterialized The isMaterialized to set.
* @since 4.2
*/
public void setMaterialized(boolean isMaterialized) {
this.isMaterialized = isMaterialized;
}
/**
* @param b
*/
public void setSystem(boolean b) {
isSystem = b;
}
public String getInsertPlan() {
return insertPlan;
}
public String getUpdatePlan() {
return updatePlan;
}
public String getDeletePlan() {
return deletePlan;
}
public void setInsertPlan(String insertPlan) {
this.insertPlan = insertPlan;
this.insertPlanEnabled = true;
}
public void setUpdatePlan(String updatePlan) {
this.updatePlan = updatePlan;
this.updatePlanEnabled = true;
}
public void setDeletePlan(String deletePlan) {
this.deletePlan = deletePlan;
this.deletePlanEnabled = true;
}
public List<ForeignKey> getForeignKeys() {
return this.foriegnKeys;
}
public void setForiegnKeys(List<ForeignKey> foriegnKeys) {
this.foriegnKeys = foriegnKeys;
}
public List<KeyRecord> getIndexes() {
return this.indexes;
}
public void setIndexes(List<KeyRecord> indexes) {
this.indexes = indexes;
}
public List<KeyRecord> getFunctionBasedIndexes() {
return functionBasedIndexes;
}
public void setFunctionBasedIndexes(List<KeyRecord> functionBasedIndexes) {
this.functionBasedIndexes = functionBasedIndexes;
}
public List<KeyRecord> getUniqueKeys() {
return this.uniqueKeys;
}
public void setUniqueKeys(List<KeyRecord> uniqueKeys) {
this.uniqueKeys = uniqueKeys;
}
public List<KeyRecord> getAccessPatterns() {
return this.accessPatterns;
}
public void setAccessPatterns(List<KeyRecord> accessPatterns) {
this.accessPatterns = accessPatterns;
}
public KeyRecord getPrimaryKey() {
return this.primaryKey;
}
public void setPrimaryKey(KeyRecord primaryKey) {
this.primaryKey = primaryKey;
}
public String getSelectTransformation() {
return selectTransformation;
}
public void setSelectTransformation(String selectTransformation) {
this.selectTransformation = selectTransformation;
}
public Table getMaterializedStageTable() {
return materializedStageTable;
}
public Table getMaterializedTable() {
return materializedTable;
}
public void setMaterializedStageTable(Table materializedStageTable) {
this.materializedStageTable = materializedStageTable;
}
public void setMaterializedTable(Table materializedTable) {
this.materializedTable = materializedTable;
}
public void setResourcePath(String resourcePath) {
this.resourcePath = resourcePath;
}
public String getResourcePath() {
return resourcePath;
}
public Collection<KeyRecord> getAllKeys() {
Collection<KeyRecord> keys = new LinkedList<KeyRecord>();
if (getPrimaryKey() != null) {
keys.add(getPrimaryKey());
}
keys.addAll(getForeignKeys());
keys.addAll(getAccessPatterns());
keys.addAll(getIndexes());
keys.addAll(getUniqueKeys());
return keys;
}
@Override
public void addColumn(Column column) {
super.addColumn(column);
column.setParent(this);
}
public long getLastDataModification() {
return lastDataModification;
}
public long getLastModified() {
return lastModified;
}
public void setLastDataModification(long lastDataModification) {
this.lastDataModification = lastDataModification;
}
public void setLastModified(long lastModified) {
this.lastModified = lastModified;
}
public void setTableStats(TableStats stats) {
if (stats.getCardinality() != null) {
setCardinality(stats.getCardinality().longValue());
}
}
public boolean isDeletePlanEnabled() {
return deletePlanEnabled;
}
public boolean isInsertPlanEnabled() {
return insertPlanEnabled;
}
public boolean isUpdatePlanEnabled() {
return updatePlanEnabled;
}
public void setInsertPlanEnabled(boolean insertPlanEnabled) {
this.insertPlanEnabled = insertPlanEnabled;
}
public void setDeletePlanEnabled(boolean deletePlanEnabled) {
this.deletePlanEnabled = deletePlanEnabled;
}
public void setUpdatePlanEnabled(boolean updatePlanEnabled) {
this.updatePlanEnabled = updatePlanEnabled;
}
private void readObject(java.io.ObjectInputStream in)
throws IOException, ClassNotFoundException {
in.defaultReadObject();
if (this.functionBasedIndexes == null) {
this.functionBasedIndexes = new ArrayList<KeyRecord>(2);
}
}
@Override
public String getFullName() {
if (this.tableType == Type.TemporaryTable && !this.isVirtual) {
return this.getName();
}
return super.getFullName();
}
}