/**
* 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.expr;
import com.google.gson.annotations.Expose;
import org.apache.tajo.annotation.Nullable;
import org.apache.tajo.catalog.Schema;
import org.apache.tajo.common.ProtoObject;
import org.apache.tajo.datum.Datum;
import org.apache.tajo.json.GsonObject;
import org.apache.tajo.plan.serder.EvalNodeSerializer;
import org.apache.tajo.plan.serder.PlanGsonHelper;
import org.apache.tajo.plan.serder.PlanProto;
import org.apache.tajo.storage.Tuple;
import org.apache.tajo.type.Type;
/**
* An annotated expression which includes actual data domains.
* It is also used for evaluation.
*/
public abstract class EvalNode implements Cloneable, GsonObject, ProtoObject<PlanProto.EvalNodeTree> {
@Expose
protected EvalType type;
protected transient boolean isBound;
public EvalNode() {
}
public EvalNode(EvalType type) {
this.type = type;
}
public EvalType getType() {
return this.type;
}
public abstract Type getValueType();
public abstract int childNum();
public abstract EvalNode getChild(int idx);
public abstract String getName();
@Override
public String toJson() {
return PlanGsonHelper.toJson(this, EvalNode.class);
}
public EvalNode bind(@Nullable EvalContext evalContext, Schema schema) {
for (int i = 0; i < childNum(); i++) {
getChild(i).bind(evalContext, schema);
}
isBound = true;
return this;
}
public <T extends Datum> T eval(Tuple tuple) {
if (!isBound) {
throw new IllegalStateException("bind() must be called before eval()");
}
return null;
}
@Deprecated
public abstract void preOrder(EvalNodeVisitor visitor);
@Deprecated
public abstract void postOrder(EvalNodeVisitor visitor);
@Override
public Object clone() throws CloneNotSupportedException {
EvalNode evalNode = (EvalNode) super.clone();
evalNode.type = type;
evalNode.isBound = isBound;
return evalNode;
}
@Override
public PlanProto.EvalNodeTree getProto() {
return EvalNodeSerializer.serialize(this);
}
}