blob: 41f34bcb659ed60da40cc9414685a59630486d4f [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.asterix.external.classad;
import org.apache.asterix.external.classad.object.pool.ClassAdObjectPool;
import org.apache.hyracks.api.exceptions.HyracksDataException;
public class EvalState {
private int depthRemaining; // max recursion depth - current depth
// Normally, rootAd will be the ClassAd at the root of the tree
// of ExprTrees in the current evaluation. That is, the parent
// scope whose parent scope is NULL.
// It can be set to a closer parent scope. Then that ClassAd is
// treated like it has no parent scope for LookupInScope() and
// Evaluate().
private final ClassAd rootAdTemp;
private final ClassAd curAdTemp;
private ClassAd rootAd;
private ClassAd curAd;
private boolean flattenAndInline; // NAC
private boolean inAttrRefScope;
private final ClassAdObjectPool objectPool;
public boolean isInAttrRefScope() {
return inAttrRefScope;
}
public void setFlattenAndInline(boolean flattenAndInline) {
this.flattenAndInline = flattenAndInline;
}
public void setInAttrRefScope(boolean inAttrRefScope) {
this.inAttrRefScope = inAttrRefScope;
}
public EvalState(ClassAdObjectPool objectPool) {
this.objectPool = objectPool;
rootAd = new ClassAd(this.objectPool);
curAd = new ClassAd(this.objectPool);
depthRemaining = ExprTree.MAX_CLASSAD_RECURSION;
flattenAndInline = false; // NAC
inAttrRefScope = false;
rootAdTemp = rootAd;
curAdTemp = curAd;
}
public boolean isFlattenAndInline() {
return flattenAndInline;
}
public void setScopes(ClassAd curScope) {
curAd = curScope;
setRootScope();
}
public void setRootScope() {
ClassAd prevScope = curAd;
if (curAd == null) {
rootAd = null;
} else {
ClassAd curScope = curAd.getParentScope();
while (curScope != null) {
if (curScope == curAd) { // NAC - loop detection
rootAd = null;
return; // NAC
} // NAC
prevScope = curScope;
curScope = curScope.getParentScope();
}
rootAd = prevScope;
}
return;
}
public void reset() {
rootAd = rootAdTemp;
curAd = curAdTemp;
rootAd.reset();
curAd.reset();
depthRemaining = ExprTree.MAX_CLASSAD_RECURSION;
flattenAndInline = false;
inAttrRefScope = false;
}
public ClassAd getRootAd() {
return rootAd;
}
public ClassAd getCurAd() {
return curAd;
}
public void setCurAd(ClassAd curAd) {
this.curAd = curAd;
}
public int getDepthRemaining() {
return depthRemaining;
}
public void decrementDepth() {
depthRemaining--;
}
public void incrementDepth() {
depthRemaining++;
}
public void setRootAd(ClassAd classAd) {
this.rootAd = classAd;
}
public void set(EvalState state) throws HyracksDataException {
rootAd = rootAdTemp;
curAd = curAdTemp;
rootAd.reset();
curAd.reset();
rootAd.copyFrom(state.rootAd);
curAd.copyFrom(state.curAd);
depthRemaining = state.depthRemaining;
flattenAndInline = state.flattenAndInline;
inAttrRefScope = state.inAttrRefScope;
}
}