Commit db6dffc9 by Harish Butani

add more ExpressionTests, fix issues uncovered

parent 072aee8d
...@@ -243,6 +243,8 @@ object Expressions { ...@@ -243,6 +243,8 @@ object Expressions {
* Fluent API methods * Fluent API methods
*/ */
def field(fieldName : String) = new UnresolvedFieldExpression(this, fieldName) def field(fieldName : String) = new UnresolvedFieldExpression(this, fieldName)
def join(fieldName : String) = field(fieldName)
def `.`(fieldName : String) = field(fieldName)
def as(alias : String) = new AliasExpression(this, alias) def as(alias : String) = new AliasExpression(this, alias)
def arith(op : String)(rightExpr : Expression) = new ArithmeticExpression(op, this, rightExpr) def arith(op : String)(rightExpr : Expression) = new ArithmeticExpression(op, this, rightExpr)
...@@ -274,11 +276,14 @@ object Expressions { ...@@ -274,11 +276,14 @@ object Expressions {
} }
trait BinaryNode { trait BinaryNode {
self : Expression =>
def left: Expression def left: Expression
def right: Expression def right: Expression
def children = Seq(left, right) def children = Seq(left, right)
override def namedExpressions = left.namedExpressions ++ right.namedExpressions
} }
trait LeafNode { trait LeafNode {
...@@ -286,8 +291,9 @@ object Expressions { ...@@ -286,8 +291,9 @@ object Expressions {
} }
trait UnaryNode { trait UnaryNode {
self : Expression =>
def child: Expression def child: Expression
override def namedExpressions = child.namedExpressions
def children = child :: Nil def children = child :: Nil
} }
...@@ -339,9 +345,11 @@ object Expressions { ...@@ -339,9 +345,11 @@ object Expressions {
lazy val dataType = fieldInfo.attrInfo.dataType() lazy val dataType = fieldInfo.attrInfo.dataType()
override lazy val resolved: Boolean = true override lazy val resolved: Boolean = true
override def namedExpressions = if ( child.isDefined ) child.get.namedExpressions else Map()
override def toString = { override def toString = {
if (child.isDefined) { if (child.isDefined) {
val sep = if (dataType.isInstanceOf[ClassType]) " " else "," val sep = if (dataType.isInstanceOf[ClassType]) " " else "."
s"${child.get}${sep}$fieldName" s"${child.get}${sep}$fieldName"
} else { } else {
fieldName fieldName
...@@ -366,7 +374,7 @@ object Expressions { ...@@ -366,7 +374,7 @@ object Expressions {
case class BackReference(alias: String, reference: Expression, child: Option[Expression]) extends Expression { case class BackReference(alias: String, reference: Expression, child: Option[Expression]) extends Expression {
val children = if (child.isDefined) List(child.get) else Nil val children = if (child.isDefined) List(child.get) else Nil
val dataType = reference.dataType val dataType = reference.dataType
override def namedExpressions = if ( child.isDefined ) child.get.namedExpressions else Map()
override def toString = if (child.isDefined) s"${child.get} $alias" else alias override def toString = if (child.isDefined) s"${child.get} $alias" else alias
} }
...@@ -533,7 +541,7 @@ object Expressions { ...@@ -533,7 +541,7 @@ object Expressions {
DataTypes.BOOLEAN_TYPE DataTypes.BOOLEAN_TYPE
} }
override def toString = children.mkString("", " and ", "") override def toString = children.mkString("", s" $symbol ", "")
} }
case class FilterExpression(val child: Expression, val condExpr: Expression) extends Expression { case class FilterExpression(val child: Expression, val condExpr: Expression) extends Expression {
...@@ -548,7 +556,7 @@ object Expressions { ...@@ -548,7 +556,7 @@ object Expressions {
} }
child.dataType child.dataType
} }
override def namedExpressions = child.namedExpressions ++ condExpr.namedExpressions
override def toString = s"$child where $condExpr" override def toString = s"$child where $condExpr"
} }
...@@ -569,6 +577,7 @@ object Expressions { ...@@ -569,6 +577,7 @@ object Expressions {
} }
TypeUtils.createStructType(selectListWithAlias) TypeUtils.createStructType(selectListWithAlias)
} }
override def namedExpressions = child.namedExpressions ++ (selectList.flatMap(_.namedExpressions))
override def toString = s"""$child select ${selectListWithAlias.mkString("", ", ", "")}""" override def toString = s"""$child select ${selectListWithAlias.mkString("", ", ", "")}"""
} }
......
...@@ -42,7 +42,8 @@ class ExpressionTest extends BaseTest { ...@@ -42,7 +42,8 @@ class ExpressionTest extends BaseTest {
def dbClsDef = new HierarchicalTypeDefinition[ClassType](classOf[ClassType], "DB", null, def dbClsDef = new HierarchicalTypeDefinition[ClassType](classOf[ClassType], "DB", null,
Array( Array(
attrDef("name", DataTypes.STRING_TYPE), attrDef("name", DataTypes.STRING_TYPE),
attrDef("owner", DataTypes.STRING_TYPE) attrDef("owner", DataTypes.STRING_TYPE),
attrDef("createTime", DataTypes.LONG_TYPE)
)) ))
def storageDescClsDef = new HierarchicalTypeDefinition[ClassType](classOf[ClassType], "StorageDesc", null, def storageDescClsDef = new HierarchicalTypeDefinition[ClassType](classOf[ClassType], "StorageDesc", null,
...@@ -157,7 +158,59 @@ class ExpressionTest extends BaseTest { ...@@ -157,7 +158,59 @@ class ExpressionTest extends BaseTest {
@Test def testBackReference: Unit = { @Test def testBackReference: Unit = {
val e = QueryProcessor.validate( val e = QueryProcessor.validate(
_class("DB").as("db").field("Table")).where(id("db").field("name").`=`(string("Reporting"))) _class("DB").as("db").field("Table").where(id("db").field("name").`=`(string("Reporting"))))
println(e)
}
@Test def testArith: Unit = {
val e = QueryProcessor.validate(_class("DB").where(id("name").`=`(string("Reporting"))).
select(id("name"), id("createTime") + int(1)))
println(e)
}
@Test def testComparisonLogical: Unit = {
val e = QueryProcessor.validate(_class("DB").where(id("name").`=`(string("Reporting")).
and(id("createTime") + int(1) > int(0))))
println(e)
}
@Test def testJoinAndSelect1: Unit = {
val e = QueryProcessor.validate(
_class("DB").as("db").field("Table").as("tab").where((id("createTime") + int(1) > int(0))
.and(id("db").field("name").`=`(string("Reporting")))).select(id("db").field("name").as("dbName"), id("tab").field("name").as("tabName"))
)
println(e)
}
@Test def testJoinAndSelect2: Unit = {
val e = QueryProcessor.validate(
_class("DB").as("db").field("Table").as("tab").where((id("createTime") + int(1) > int(0))
.or(id("db").field("name").`=`(string("Reporting"))))
.select(id("db").field("name").as("dbName"), id("tab").field("name").as("tabName"))
)
println(e)
}
@Test def testJoinAndSelect3: Unit = {
val e = QueryProcessor.validate(
_class("DB").as("db").field("Table").as("tab").where((id("createTime") + int(1) > int(0))
.and(id("db").field("name").`=`(string("Reporting")))
.or(id("db").hasField("owner")))
.select(id("db").field("name").as("dbName"), id("tab").field("name").as("tabName"))
)
println(e)
}
@Test def testJoinAndSelect4: Unit = {
val e = QueryProcessor.validate(
_class("DB") as "db" join "Table" as "tab" where (
id("createTime") + int(1) > int(0) and
( id("db") `.` "name" `=` string("Reporting") ) or
( id("db") hasField "owner" )
) select (
id("db") `.` "name" as "dbName", id("tab") `.` "name" as "tabName"
)
)
println(e) println(e)
} }
} }
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