package com.tesora.dve.sql.expression; /* * #%L * Tesora Inc. * Database Virtualization Engine * %% * Copyright (C) 2011 - 2014 Tesora Inc. * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License, version 3, * as published by the Free Software Foundation. * * This program 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 Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * #L% */ import com.tesora.dve.lockmanager.LockSpecification; import com.tesora.dve.sql.node.expression.MTTableInstance; import com.tesora.dve.sql.node.expression.TableInstance; import com.tesora.dve.sql.node.expression.TriggerTableInstance; import com.tesora.dve.sql.schema.AutoIncrement; import com.tesora.dve.sql.schema.ComplexPETable; import com.tesora.dve.sql.schema.HasTable; import com.tesora.dve.sql.schema.PEAbstractTable; import com.tesora.dve.sql.schema.SchemaContext; import com.tesora.dve.sql.schema.Table; import com.tesora.dve.sql.schema.cache.SchemaCacheKey; import com.tesora.dve.sql.schema.mt.TableScope; public class TableKey extends RewriteKey implements AutoIncrement { protected Table<?> backingTable; protected long node; protected TableInstance instance = null; TableKey(Table<?> backing, long n) { super(); backingTable = backing; node = n; } @Override public TableInstance toInstance() { if (instance == null) instance = new TableInstance(backingTable, null, null, node,true); return instance; } TableKey(TableInstance ti) { super(); backingTable = ti.getTable(); node = ti.getNode(); instance = ti; } public static TableKey make(TableInstance ti) { if (ti instanceof TriggerTableInstance) return new TriggerTableKey((TriggerTableInstance)ti); if (ti instanceof MTTableInstance) return new MTTableKey((MTTableInstance)ti); if (ti.getTable() instanceof ComplexPETable) { ComplexPETable ctab = (ComplexPETable) ti.getTable(); if (ctab.isUserlandTemporaryTable()) return new TemporaryTableKey(ti); } return new TableKey(ti); } public static TableKey make(SchemaContext sc, HasTable backing, long n) { if (backing instanceof TableScope) { TableScope ts = (TableScope) backing; return new MTTableKey(ts.getTable(sc),ts,n); } if (backing instanceof ComplexPETable) { ComplexPETable ctab = (ComplexPETable) backing; if (ctab.isUserlandTemporaryTable()) return new TemporaryTableKey(ctab,n); } return new TableKey((Table<?>)backing,n); } public long getNode() { return node; } // view support public void setNode(long l) { hc = null; node = l; } public Table<?> getTable() { return backingTable; } public PEAbstractTable<?> getAbstractTable() { return (PEAbstractTable<?>)backingTable; } @Override protected int computeHashCode() { final int prime = 31; int result = 0; result = prime * result + ((backingTable == null) ? 0 : backingTable.hashCode()); result = prime * result + (int) (node ^ (node >>> 32)); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; TableKey other = (TableKey) obj; if (backingTable == null) { if (other.backingTable != null) return false; } else if (!backingTable.equals(other.backingTable)) return false; if (node != other.node) return false; return true; } @Override public String toString() { String tn = null; if (backingTable instanceof PEAbstractTable) { PEAbstractTable<?> pet = (PEAbstractTable<?>) backingTable; if (pet.isTempTable()) { SchemaContext sc = SchemaContext.threadContext.get(); tn = pet.getName(sc,sc.getValues()).get(); } else tn = pet.getName().get(); } else { tn = backingTable.getName().get(); } String un = ((instance == null || instance.getAlias() == null) ? "" : "(" + instance.getAlias().getUnquotedName().get() + ")"); return "TableKey{" + tn + un + ":" + node + "}"; } public String describe(SchemaContext sc) { StringBuilder buf = new StringBuilder(); buf.append("TableKey{").append(backingTable.getName(sc,sc.getValues()).get()); if (instance != null && instance.getAlias() != null) buf.append("(").append(instance.getAlias().get()).append(")"); buf.append(":").append(node).append("}"); return buf.toString(); } public void reload(SchemaContext sc) { if (backingTable instanceof PEAbstractTable) { backingTable = (Table<?>) sc.getSource().find(sc, ((PEAbstractTable<?>)backingTable).getCacheKey()); clearHashCode(); } } public Integer getAutoIncTrackerID() { return getAbstractTable().asTable().getAutoIncrTrackerID(); } public SchemaCacheKey<?> getCacheKey() { if (backingTable instanceof PEAbstractTable) return ((PEAbstractTable<?>)backingTable).getCacheKey(); return null; } public void setFrozen() { if (instance != null) instance.setParent(null); } public LockSpecification buildLock(String reason) { SchemaCacheKey<?> sck = getCacheKey(); if (sck == null) return null; return sck.getLockSpecification(reason); } @Override public long getNextAutoIncrBlock(SchemaContext sc, long blockSize) { return sc.getPolicyContext().getNextAutoIncrBlock(toInstance(), blockSize); } @Override public long readAutoIncrBlock(SchemaContext sc) { return sc.getPolicyContext().readAutoIncrBlock(this); } @Override public void removeValue(SchemaContext sc, long value) { sc.getPolicyContext().removeValue(this, value); } public TableKey makeFrozen() { return new TableKey(backingTable,node); } public boolean isUserlandTemporaryTable() { return false; } }