in repository/src/main/scala/org/apache/atlas/query/Resolver.scala [31:116]
def isDefinedAt(x: Expression) = true
def apply(e: Expression): Expression = e match {
case idE@IdExpression(name, exprType) => {
val backExpr = aliases.get(name)
if (backExpr.isDefined) {
if(backExpr.get.resolved) {
return new BackReference(name, backExpr.get, None)
}
else {
//replace once resolved
return idE;
}
}
if (srcExpr.isDefined) {
val fInfo = resolveReference(srcExpr.get.dataType, name)
if (fInfo.isDefined) {
return new FieldExpression(name, fInfo.get, None)
}
}
if(exprType.isTypeAllowed) {
val dt = resolveAsDataType(name);
if(dt.isDefined) {
if(dt.get.isInstanceOf[ClassType]) {
return new ClassExpression(name)
}
if(dt.get.isInstanceOf[TraitType]) {
return new TraitExpression(name)
}
}
}
idE
}
case ce@ClassExpression(clsName) if connectClassExprToSrc && srcExpr.isDefined => {
val fInfo = resolveReference(srcExpr.get.dataType, clsName)
if (fInfo.isDefined) {
return new FieldExpression(clsName, fInfo.get, None)
}
ce
}
case f@UnresolvedFieldExpression(child, fieldName) if child.resolved => {
var fInfo: Option[FieldInfo] = None
fInfo = resolveReference(child.dataType, fieldName)
if (fInfo.isDefined) {
return new FieldExpression(fieldName, fInfo.get, Some(child))
}
val tType = resolveAsTraitType(fieldName)
if (tType.isDefined) {
return new FieldExpression(fieldName, FieldInfo(child.dataType, null, null, fieldName), Some(child))
}
f
}
case isTraitLeafExpression(traitName, classExpression)
if srcExpr.isDefined && !classExpression.isDefined =>
isTraitLeafExpression(traitName, srcExpr)
case hasFieldLeafExpression(traitName, classExpression)
if srcExpr.isDefined && !classExpression.isDefined =>
hasFieldLeafExpression(traitName, srcExpr)
case f@FilterExpression(inputExpr, condExpr) if inputExpr.resolved => {
val r = new Resolver(Some(inputExpr), inputExpr.namedExpressions)
return new FilterExpression(inputExpr, condExpr.transformUp(r))
}
case SelectExpression(child, selectList, forGroupBy) if child.resolved => {
val r = new Resolver(Some(child), child.namedExpressions)
return new SelectExpression(child, selectList.map {
_.transformUp(r)
}, forGroupBy)
}
case l@LoopExpression(inputExpr, loopExpr, t) if inputExpr.resolved => {
val r = new Resolver(Some(inputExpr), inputExpr.namedExpressions, true)
return new LoopExpression(inputExpr, loopExpr.transformUp(r), t)
}
case lmt@LimitExpression(child, limit, offset) => {
val r = new Resolver(Some(child), child.namedExpressions)
return new LimitExpression(child.transformUp(r), limit, offset)
}
case order@OrderExpression(child, odr, asc) => {
val r = new Resolver(Some(child), child.namedExpressions)
return new OrderExpression(child, odr.transformUp(r), asc)
}
case x => x
}