package com.tesora.dve.sql.node.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.sql.expression.ColumnKey; import com.tesora.dve.sql.expression.RewriteKey; import com.tesora.dve.sql.node.LanguageNode; import com.tesora.dve.sql.schema.Column; import com.tesora.dve.sql.schema.Name; import com.tesora.dve.sql.schema.PEColumn; import com.tesora.dve.sql.schema.SchemaContext; import com.tesora.dve.sql.schema.UnqualifiedName; import com.tesora.dve.sql.transform.CopyContext; import com.tesora.dve.sql.util.Accessor; import com.tesora.dve.sql.util.Cast; public class ColumnInstance extends ExpressionNode { public static final Cast<ColumnInstance, ExpressionNode> castTo = new Cast<ColumnInstance, ExpressionNode>(); public static final Accessor<TableInstance, ColumnInstance> getTableInstance = new Accessor<TableInstance, ColumnInstance>() { @Override public TableInstance evaluate(ColumnInstance object) { return object.getTableInstance(); } }; public static final Accessor<Column<?>, ColumnInstance> getColumn = new Accessor<Column<?>, ColumnInstance>() { @Override public Column<?> evaluate(ColumnInstance object) { return object.getColumn(); } }; public static final Accessor<PEColumn, ColumnInstance> getPEColumn = new Accessor<PEColumn, ColumnInstance>() { @Override public PEColumn evaluate(ColumnInstance object) { return object.getPEColumn(); } }; public static final Accessor<ColumnKey, ColumnInstance> getColumnKey = new Accessor<ColumnKey, ColumnInstance>() { @Override public ColumnKey evaluate(ColumnInstance object) { return object.getColumnKey(); } }; protected Column<?> schemaColumn; protected TableInstance ofTable; protected Name specifiedAs; public ColumnInstance(Name origName, Column<?> column, TableInstance table) { super(origName == null ? null : origName.getOrig()); ofTable = table; schemaColumn = column; specifiedAs = origName; } public ColumnInstance(Column<?> c, TableInstance ti) { this(null,c,ti); } public TableInstance getTableInstance() { return ofTable; } public Column<?> getColumn() { return schemaColumn; } public PEColumn getPEColumn() { return (PEColumn)schemaColumn; } public Name getSpecifiedAs() { return specifiedAs; } public Name getReferenceName(SchemaContext sc) { if (schemaColumn == null) return specifiedAs; if (specifiedAs == null || !specifiedAs.isQualified()) return schemaColumn.getName().getUnqualified().postfix(ofTable.getReferenceName(sc)); else return specifiedAs; } @Override protected ColumnInstance copySelf(CopyContext cc) { if (cc == null) return new ColumnInstance(specifiedAs, schemaColumn, ofTable); ColumnInstance out = cc.getColumnInstance(this); if (out != null) return out; TableInstance cti = cc.getTableInstance(ofTable); if (cti == null) cti = (TableInstance) ofTable.copy(cc); out = new ColumnInstance(specifiedAs, schemaColumn, cti); return cc.put(this, out); } @Override public NameAlias buildAlias(SchemaContext sc) { String fl = schemaColumn.getName().getUnquotedName().getUnqualified().get().trim().substring(0,1); return new NameAlias(new UnqualifiedName(ofTable.buildAlias(sc).get() + fl + schemaColumn.getPosition())); } public ColumnKey getColumnKey() { return new ColumnKey(this); } public boolean rewriteEqual(ColumnInstance other) { return getColumnKey().equals(other.getColumnKey()); } @Override public RewriteKey getRewriteKey() { return getColumnKey(); } public ColumnInstance postFlipAdapt(TableInstance repl) { return new ColumnInstance(specifiedAs,schemaColumn,repl); } public void reload(SchemaContext sc) { ofTable.reload(sc); schemaColumn = ofTable.getTable().lookup(sc, schemaColumn.getName()); } @Override protected boolean schemaSelfEqual(LanguageNode other) { ColumnInstance oci = (ColumnInstance) other; return getColumnKey().equals(oci.getColumnKey()); } @Override protected int selfHashCode() { return getColumnKey().hashCode(); } }