Commit 1c90177f by Harish Butani

BUG-38021: add the superType check for loop expressions; also did some cleanup,…

BUG-38021: add the superType check for loop expressions; also did some cleanup, moved the typeTest logic to GraphPersistenceStrategies
parent 456a8096
...@@ -22,6 +22,7 @@ import com.thinkaurelius.titan.core.TitanVertex; ...@@ -22,6 +22,7 @@ import com.thinkaurelius.titan.core.TitanVertex;
import org.apache.hadoop.metadata.MetadataException; import org.apache.hadoop.metadata.MetadataException;
import org.apache.hadoop.metadata.query.Expressions; import org.apache.hadoop.metadata.query.Expressions;
import org.apache.hadoop.metadata.query.GraphPersistenceStrategies; import org.apache.hadoop.metadata.query.GraphPersistenceStrategies;
import org.apache.hadoop.metadata.query.GraphPersistenceStrategies$class;
import org.apache.hadoop.metadata.query.TypeUtils; import org.apache.hadoop.metadata.query.TypeUtils;
import org.apache.hadoop.metadata.repository.MetadataRepository; import org.apache.hadoop.metadata.repository.MetadataRepository;
import org.apache.hadoop.metadata.repository.Constants; import org.apache.hadoop.metadata.repository.Constants;
...@@ -168,33 +169,12 @@ public class DefaultGraphPersistenceStrategy implements GraphPersistenceStrategi ...@@ -168,33 +169,12 @@ public class DefaultGraphPersistenceStrategy implements GraphPersistenceStrategi
@Override @Override
public String gremlinCompOp(Expressions.ComparisonExpression op) { public String gremlinCompOp(Expressions.ComparisonExpression op) {
switch (op.symbol()) { return GraphPersistenceStrategies$class.gremlinCompOp(this, op);
case "=":
return "T.eq";
case "!=":
return "T.neq";
case ">":
return "T.gt";
case ">=":
return "T.gte";
case "<":
return "T.lt";
case "<=":
return "T.lte";
default:
throw new RuntimeException(("Comparison operator not supported in Gremlin: " + op));
}
} }
@Override @Override
public String loopObjectExpression(IDataType<?> dataType) { public String loopObjectExpression(IDataType<?> dataType) {
return "{it.object." + typeAttributeName() + " == '" + dataType.getName() + "'}"; return GraphPersistenceStrategies$class.loopObjectExpression(this, dataType);
} }
@Override @Override
...@@ -206,4 +186,9 @@ public class DefaultGraphPersistenceStrategy implements GraphPersistenceStrategi ...@@ -206,4 +186,9 @@ public class DefaultGraphPersistenceStrategy implements GraphPersistenceStrategi
@Override @Override
public String idAttributeName() { return metadataRepository.getIdAttributeName(); } public String idAttributeName() { return metadataRepository.getIdAttributeName(); }
@Override
public String typeTestExpression(String typeName) {
return GraphPersistenceStrategies$class.typeTestExpression(this, typeName);
}
} }
...@@ -112,8 +112,19 @@ trait GraphPersistenceStrategies { ...@@ -112,8 +112,19 @@ trait GraphPersistenceStrategies {
} }
def loopObjectExpression(dataType: IDataType[_]) = { def loopObjectExpression(dataType: IDataType[_]) = {
s"{it.object.'${typeAttributeName}' == '${dataType.getName}'}" _typeTestExpression(dataType.getName, "it.object")
} }
def typeTestExpression(typeName : String) :String = {
_typeTestExpression(typeName, "it")
}
private def _typeTestExpression(typeName: String, itRef: String): String = {
s"""{(${itRef}.'${typeAttributeName}' == '${typeName}') |
|(${itRef}.'${superTypeAttributeName}' ?
|${itRef}.'${superTypeAttributeName}'.contains('${typeName}') : false)}""".
stripMargin.replace(System.getProperty("line.separator"), "")
}
} }
object GraphPersistenceStrategy1 extends GraphPersistenceStrategies { object GraphPersistenceStrategy1 extends GraphPersistenceStrategies {
......
...@@ -185,13 +185,9 @@ class GremlinTranslator(expr: Expression, ...@@ -185,13 +185,9 @@ class GremlinTranslator(expr: Expression,
private def genQuery(expr: Expression, inSelect: Boolean): String = expr match { private def genQuery(expr: Expression, inSelect: Boolean): String = expr match {
case ClassExpression(clsName) => case ClassExpression(clsName) =>
val typeName = gPersistenceBehavior.typeAttributeName s"""filter${gPersistenceBehavior.typeTestExpression(clsName)}"""
val superTypeName = gPersistenceBehavior.superTypeAttributeName
s"""filter{(it.$typeName == "$clsName") | (it.$superTypeName ? it.$superTypeName.contains("$clsName") : false)}"""
case TraitExpression(clsName) => case TraitExpression(clsName) =>
val typeName = gPersistenceBehavior.typeAttributeName s"""filter${gPersistenceBehavior.typeTestExpression(clsName)}"""
val superTypeName = gPersistenceBehavior.superTypeAttributeName
s"""filter{(it.$typeName == "$clsName") | (it.$superTypeName ? it.$superTypeName.contains("$clsName") : false)}"""
case fe@FieldExpression(fieldName, fInfo, child) if fe.dataType.getTypeCategory == TypeCategory.PRIMITIVE => { case fe@FieldExpression(fieldName, fInfo, child) if fe.dataType.getTypeCategory == TypeCategory.PRIMITIVE => {
val fN = "\"" + gPersistenceBehavior.fieldNameInVertex(fInfo.dataType, fInfo.attrInfo) + "\"" val fN = "\"" + gPersistenceBehavior.fieldNameInVertex(fInfo.dataType, fInfo.attrInfo) + "\""
child match { child match {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment