blob: a993d6425f8bd892173681f02c1b7dcc76c06ae6 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.tajo.plan.logical;
import com.google.gson.annotations.Expose;
import org.apache.tajo.catalog.Schema;
import org.apache.tajo.catalog.SchemaFactory;
import org.apache.tajo.catalog.TableDesc;
import org.apache.tajo.plan.PlanString;
import org.apache.tajo.util.TUtil;
public class InsertNode extends StoreTableNode implements Cloneable {
/** Overwrite or just insert */
@Expose private boolean overwrite;
/** a target schema of a target table */
@Expose private Schema targetSchema;
/** a output schema of select clause */
@Expose private Schema projectedSchema;
public InsertNode(int pid) {
super(pid, NodeType.INSERT);
}
public void setTargetTable(TableDesc desc) {
setTableName(desc.getName());
if (desc.hasPartition()) {
tableSchema = desc.getLogicalSchema();
} else {
tableSchema = desc.getSchema();
}
if (desc.getUri() != null) {
setUri(desc.getUri());
}
setOptions(desc.getMeta().getPropertySet());
setDataFormat(desc.getMeta().getDataFormat());
if (desc.hasPartition()) {
this.setPartitionMethod(desc.getPartitionMethod());
}
}
public void setSubQuery(LogicalNode subQuery) {
this.setChild(subQuery);
this.setInSchema(subQuery.getOutSchema());
this.setOutSchema(subQuery.getOutSchema());
}
public boolean isOverwrite() {
return overwrite;
}
public void setOverwrite(boolean overwrite) {
this.overwrite = overwrite;
}
public boolean hasTargetSchema() {
return this.targetSchema != null;
}
public Schema getTargetSchema() {
return this.targetSchema;
}
public void setTargetSchema(Schema schema) {
this.targetSchema = schema;
}
public boolean hasProjectedSchema() {
return this.projectedSchema != null;
}
public Schema getProjectedSchema() {
return this.projectedSchema;
}
public void setProjectedSchema(Schema projected) {
this.projectedSchema = projected;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + (overwrite ? 1231 : 1237);
result = prime * result + ((uri == null) ? 0 : uri.hashCode());
result = prime * result + ((projectedSchema == null) ? 0 : projectedSchema.hashCode());
result = prime * result + ((tableSchema == null) ? 0 : tableSchema.hashCode());
result = prime * result + ((targetSchema == null) ? 0 : targetSchema.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof InsertNode) {
InsertNode other = (InsertNode) obj;
boolean eq = super.equals(other);
eq &= this.overwrite == other.overwrite;
eq &= TUtil.checkEquals(this.targetSchema, other.targetSchema);
eq &= TUtil.checkEquals(this.projectedSchema, other.projectedSchema);
return eq;
} else {
return false;
}
}
@Override
public Object clone() throws CloneNotSupportedException {
InsertNode insertNode = (InsertNode) super.clone();
insertNode.overwrite = overwrite;
insertNode.tableSchema = SchemaFactory.newV1(tableSchema);
insertNode.targetSchema = targetSchema != null ? SchemaFactory.newV1(targetSchema) : null;
insertNode.projectedSchema = projectedSchema != null ? SchemaFactory.newV1(projectedSchema) : null;
insertNode.uri = uri != null ? uri : null;
return insertNode;
}
public String toString() {
StringBuilder sb = new StringBuilder("Insert (overwrite=").append(overwrite);
if (hasTargetTable()) {
sb.append(",table=").append(tableName);
}
if (hasUri()) {
sb.append(", location=").append(uri);
}
sb.append(")");
return sb.toString();
}
@Override
public void preOrder(LogicalNodeVisitor visitor) {
getChild().preOrder(visitor);
visitor.visit(this);
}
@Override
public void postOrder(LogicalNodeVisitor visitor) {
visitor.visit(this);
getChild().postOrder(visitor);
}
@Override
public PlanString getPlanString() {
PlanString planString = new PlanString(this);
planString.appendTitle(" INTO ");
if (hasTargetTable()) {
planString.appendTitle(getTableName());
if (hasTargetSchema()) {
planString.addExplan(getTargetSchema().toString());
}
} else {
planString.addExplan("LOCATION " + uri);
}
return planString;
}
}