Commit 47594923 by Harish Butani

simplified toStrings, fix issues exposed with fieldValidator in play

parent d7c74678
...@@ -249,6 +249,7 @@ object Expressions { ...@@ -249,6 +249,7 @@ object Expressions {
case e: Expression if e.toString contains "\n" => s"(${e.simpleString})" :: Nil case e: Expression if e.toString contains "\n" => s"(${e.simpleString})" :: Nil
case seq: Seq[_] => seq.mkString("[", ",", "]") :: Nil case seq: Seq[_] => seq.mkString("[", ",", "]") :: Nil
case set: Set[_] => set.mkString("{", ",", "}") :: Nil case set: Set[_] => set.mkString("{", ",", "}") :: Nil
case f : IDataType[_] => f.getName :: Nil
case other => other :: Nil case other => other :: Nil
}.mkString(", ") }.mkString(", ")
......
...@@ -53,7 +53,10 @@ trait SelectExpressionHandling { ...@@ -53,7 +53,10 @@ trait SelectExpressionHandling {
} }
def apply(e: Expression) = e match { def apply(e: Expression) = e match {
case SelectExpression(_: AliasExpression, _) => e case SelectExpression(aliasE@AliasExpression(_,_), selList) => {
idx = idx + 1
SelectExpression(aliasE, selList.map(_.transformUp(new DecorateFieldWithAlias(aliasE))))
}
case SelectExpression(child, selList) => { case SelectExpression(child, selList) => {
idx = idx + 1 idx = idx + 1
val aliasE = AliasExpression(child, s"_src$idx") val aliasE = AliasExpression(child, s"_src$idx")
......
...@@ -85,18 +85,20 @@ object FieldValidator extends PartialFunction[Expression, Expression] { ...@@ -85,18 +85,20 @@ object FieldValidator extends PartialFunction[Expression, Expression] {
def isDefinedAt(x: Expression) = true def isDefinedAt(x: Expression) = true
def isSrc(e : Expression) = e.isInstanceOf[ClassExpression] || e.isInstanceOf[TraitExpression]
def validateQualifiedField(srcDataType : IDataType[_]) : PartialFunction[Expression, Expression] = { def validateQualifiedField(srcDataType : IDataType[_]) : PartialFunction[Expression, Expression] = {
case FieldExpression(fNm, fInfo, Some(child)) if child.children == Nil && child.dataType == srcDataType => case FieldExpression(fNm, fInfo, Some(child)) if (child.children == Nil && child.dataType == srcDataType) =>
FieldExpression(fNm, fInfo, None) FieldExpression(fNm, fInfo, None)
case fe@FieldExpression(fNm, fInfo, Some(child)) if child.children == Nil => case fe@FieldExpression(fNm, fInfo, Some(child)) if isSrc(child) =>
throw new ExpressionException(fe, s"srcType of field doesn't match input type") throw new ExpressionException(fe, s"srcType of field doesn't match input type")
case hasFieldUnaryExpression(fNm, child) if child.dataType == srcDataType => case hasFieldUnaryExpression(fNm, child) if child.dataType == srcDataType =>
hasFieldLeafExpression(fNm) hasFieldLeafExpression(fNm)
case hF@hasFieldUnaryExpression(fNm, child) => case hF@hasFieldUnaryExpression(fNm, child) if isSrc(child) =>
throw new ExpressionException(hF, s"srcType of field doesn't match input type") throw new ExpressionException(hF, s"srcType of field doesn't match input type")
case isTraitUnaryExpression(fNm, child) if child.dataType == srcDataType => case isTraitUnaryExpression(fNm, child) if child.dataType == srcDataType =>
isTraitLeafExpression(fNm) isTraitLeafExpression(fNm)
case iT@isTraitUnaryExpression(fNm, child) => case iT@isTraitUnaryExpression(fNm, child) if isSrc(child) =>
throw new ExpressionException(iT, s"srcType of field doesn't match input type") throw new ExpressionException(iT, s"srcType of field doesn't match input type")
} }
......
...@@ -79,6 +79,13 @@ object TypeUtils { ...@@ -79,6 +79,13 @@ object TypeUtils {
import scala.language.existentials import scala.language.existentials
case class FieldInfo(dataType : IDataType[_], attrInfo : AttributeInfo, reverseDataType : IDataType[_] = null) { case class FieldInfo(dataType : IDataType[_], attrInfo : AttributeInfo, reverseDataType : IDataType[_] = null) {
def isReverse = reverseDataType != null def isReverse = reverseDataType != null
override def toString : String = {
if ( reverseDataType == null ) {
s"""FieldInfo("${dataType.getName}", "${attrInfo.name}")"""
} else {
s"""FieldInfo("${dataType.getName}", "${attrInfo.name}", "${reverseDataType.getName}")"""
}
}
} }
/** /**
......
...@@ -109,7 +109,7 @@ class ExpressionTest extends BaseTest { ...@@ -109,7 +109,7 @@ 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("db1").field("Table").where(id("db1").field("name").`=`(string("Reporting"))))
println(e) println(e)
} }
...@@ -127,8 +127,8 @@ class ExpressionTest extends BaseTest { ...@@ -127,8 +127,8 @@ class ExpressionTest extends BaseTest {
@Test def testJoinAndSelect1: Unit = { @Test def testJoinAndSelect1: Unit = {
val e = QueryProcessor.validate( val e = QueryProcessor.validate(
_class("DB").as("db").field("Table").as("tab").where((id("db").field("createTime") + int(1) > int(0)) _class("DB").as("db1").field("Table").as("tab").where((id("db1").field("createTime") + int(1) > int(0))
.and(id("db").field("name").`=`(string("Reporting")))).select(id("db").field("name").as("dbName"), .and(id("db1").field("name").`=`(string("Reporting")))).select(id("db1").field("name").as("dbName"),
id("tab").field("name").as("tabName")) id("tab").field("name").as("tabName"))
) )
println(e) println(e)
...@@ -136,31 +136,31 @@ class ExpressionTest extends BaseTest { ...@@ -136,31 +136,31 @@ class ExpressionTest extends BaseTest {
@Test def testJoinAndSelect2: Unit = { @Test def testJoinAndSelect2: Unit = {
val e = QueryProcessor.validate( val e = QueryProcessor.validate(
_class("DB").as("db").field("Table").as("tab").where((id("db").field("createTime") + int(1) > int(0)) _class("DB").as("db1").field("Table").as("tab").where((id("db1").field("createTime") + int(1) > int(0))
.or(id("db").field("name").`=`(string("Reporting")))) .or(id("db1").field("name").`=`(string("Reporting"))))
.select(id("db").field("name").as("dbName"), id("tab").field("name").as("tabName")) .select(id("db1").field("name").as("dbName"), id("tab").field("name").as("tabName"))
) )
println(e) println(e)
} }
@Test def testJoinAndSelect3: Unit = { @Test def testJoinAndSelect3: Unit = {
val e = QueryProcessor.validate( val e = QueryProcessor.validate(
_class("DB").as("db").field("Table").as("tab").where((id("db").field("createTime") + int(1) > int(0)) _class("DB").as("db1").field("Table").as("tab").where((id("db1").field("createTime") + int(1) > int(0))
.and(id("db").field("name").`=`(string("Reporting"))) .and(id("db1").field("name").`=`(string("Reporting")))
.or(id("db").hasField("owner"))) .or(id("db1").hasField("owner")))
.select(id("db").field("name").as("dbName"), id("tab").field("name").as("tabName")) .select(id("db1").field("name").as("dbName"), id("tab").field("name").as("tabName"))
) )
println(e) println(e)
} }
@Test def testJoinAndSelect4: Unit = { @Test def testJoinAndSelect4: Unit = {
val e = QueryProcessor.validate( val e = QueryProcessor.validate(
_class("DB") as "db" join "Table" as "tab" where ( _class("DB") as "db1" join "Table" as "tab" where (
id("db").field("createTime") + int(1) > int(0) and id("db1").field("createTime") + int(1) > int(0) and
( id("db") `.` "name" `=` string("Reporting") ) or ( id("db1") `.` "name" `=` string("Reporting") ) or
( id("db") hasField "owner" ) ( id("db1") hasField "owner" )
) select ( ) select (
id("db") `.` "name" as "dbName", id("tab") `.` "name" as "tabName" id("db1") `.` "name" as "dbName", id("tab") `.` "name" as "tabName"
) )
) )
println(e) println(e)
......
...@@ -102,7 +102,7 @@ class GremlinTest extends FunSuite with BeforeAndAfterAll { ...@@ -102,7 +102,7 @@ class GremlinTest extends FunSuite with BeforeAndAfterAll {
where((isTrait("Dimension"))). where((isTrait("Dimension"))).
select(id("db1").field("name").as("dbName"), id("tab").field("name").as("tabName")),g select(id("db1").field("name").as("dbName"), id("tab").field("name").as("tabName")),g
) )
validateJson(r, "{\n \"query\":\"DB as db1 where (name = \\\"Sales\\\") Table as tab where DB as db1 where (name = \\\"Sales\\\") Table as tab is Dimension as _src1 select db1.name as dbName, tab.name as tabName\",\n \"dataType\":{\n \"typeName\":\"__tempQueryResultStruct5\",\n \"attributeDefinitions\":[\n {\n \"name\":\"dbName\",\n \"dataTypeName\":\"string\",\n \"multiplicity\":{\n \"lower\":0,\n \"upper\":1,\n \"isUnique\":false\n },\n \"isComposite\":false,\n \"isUnique\":false,\n \"isIndexable\":true,\n \"reverseAttributeName\":null\n },\n {\n \"name\":\"tabName\",\n \"dataTypeName\":\"string\",\n \"multiplicity\":{\n \"lower\":0,\n \"upper\":1,\n \"isUnique\":false\n },\n \"isComposite\":false,\n \"isUnique\":false,\n \"isIndexable\":true,\n \"reverseAttributeName\":null\n }\n ]\n },\n \"rows\":[\n {\n \"$typeName$\":\"__tempQueryResultStruct5\",\n \"dbName\":\"Sales\",\n \"tabName\":\"product_dim\"\n },\n {\n \"$typeName$\":\"__tempQueryResultStruct5\",\n \"dbName\":\"Sales\",\n \"tabName\":\"time_dim\"\n },\n {\n \"$typeName$\":\"__tempQueryResultStruct5\",\n \"dbName\":\"Sales\",\n \"tabName\":\"customer_dim\"\n }\n ]\n}") validateJson(r, "{\n \"query\":\"DB as db1 where (name = \\\"Sales\\\") Table as tab where DB as db1 where (name = \\\"Sales\\\") Table as tab is Dimension as _src1 select db1.name as dbName, _src1.name as tabName\",\n \"dataType\":{\n \"typeName\":\"__tempQueryResultStruct5\",\n \"attributeDefinitions\":[\n {\n \"name\":\"dbName\",\n \"dataTypeName\":\"string\",\n \"multiplicity\":{\n \"lower\":0,\n \"upper\":1,\n \"isUnique\":false\n },\n \"isComposite\":false,\n \"isUnique\":false,\n \"isIndexable\":true,\n \"reverseAttributeName\":null\n },\n {\n \"name\":\"tabName\",\n \"dataTypeName\":\"string\",\n \"multiplicity\":{\n \"lower\":0,\n \"upper\":1,\n \"isUnique\":false\n },\n \"isComposite\":false,\n \"isUnique\":false,\n \"isIndexable\":true,\n \"reverseAttributeName\":null\n }\n ]\n },\n \"rows\":[\n {\n \"$typeName$\":\"__tempQueryResultStruct5\",\n \"dbName\":\"Sales\",\n \"tabName\":\"product_dim\"\n },\n {\n \"$typeName$\":\"__tempQueryResultStruct5\",\n \"dbName\":\"Sales\",\n \"tabName\":\"time_dim\"\n },\n {\n \"$typeName$\":\"__tempQueryResultStruct5\",\n \"dbName\":\"Sales\",\n \"tabName\":\"customer_dim\"\n }\n ]\n}")
} }
test("testJoinAndSelect2") { test("testJoinAndSelect2") {
...@@ -111,7 +111,7 @@ class GremlinTest extends FunSuite with BeforeAndAfterAll { ...@@ -111,7 +111,7 @@ class GremlinTest extends FunSuite with BeforeAndAfterAll {
.or(id("name").`=`(string("Reporting")))).field("Table").as("tab") .or(id("name").`=`(string("Reporting")))).field("Table").as("tab")
.select(id("db1").field("name").as("dbName"), id("tab").field("name").as("tabName")), g .select(id("db1").field("name").as("dbName"), id("tab").field("name").as("tabName")), g
) )
validateJson(r, "{\n \"query\":\"DB as db1 where (db1.createTime > 0) or (name = \\\"Reporting\\\") Table as tab select db1.name as dbName, tab.name as tabName\",\n \"dataType\":{\n \"typeName\":\"__tempQueryResultStruct6\",\n \"attributeDefinitions\":[\n {\n \"name\":\"dbName\",\n \"dataTypeName\":\"string\",\n \"multiplicity\":{\n \"lower\":0,\n \"upper\":1,\n \"isUnique\":false\n },\n \"isComposite\":false,\n \"isUnique\":false,\n \"isIndexable\":true,\n \"reverseAttributeName\":null\n },\n {\n \"name\":\"tabName\",\n \"dataTypeName\":\"string\",\n \"multiplicity\":{\n \"lower\":0,\n \"upper\":1,\n \"isUnique\":false\n },\n \"isComposite\":false,\n \"isUnique\":false,\n \"isIndexable\":true,\n \"reverseAttributeName\":null\n }\n ]\n },\n \"rows\":[\n {\n \"$typeName$\":\"__tempQueryResultStruct6\",\n \"dbName\":\"Sales\",\n \"tabName\":\"sales_fact\"\n },\n {\n \"$typeName$\":\"__tempQueryResultStruct6\",\n \"dbName\":\"Sales\",\n \"tabName\":\"product_dim\"\n },\n {\n \"$typeName$\":\"__tempQueryResultStruct6\",\n \"dbName\":\"Sales\",\n \"tabName\":\"time_dim\"\n },\n {\n \"$typeName$\":\"__tempQueryResultStruct6\",\n \"dbName\":\"Sales\",\n \"tabName\":\"customer_dim\"\n },\n {\n \"$typeName$\":\"__tempQueryResultStruct6\",\n \"dbName\":\"Reporting\",\n \"tabName\":\"sales_fact_daily_mv\"\n },\n {\n \"$typeName$\":\"__tempQueryResultStruct6\",\n \"dbName\":\"Reporting\",\n \"tabName\":\"sales_fact_monthly_mv\"\n }\n ]\n}") validateJson(r, "{\n \"query\":\"DB as db1 where (createTime > 0) or (name = \\\"Reporting\\\") Table as tab select db1.name as dbName, tab.name as tabName\",\n \"dataType\":{\n \"typeName\":\"__tempQueryResultStruct6\",\n \"attributeDefinitions\":[\n {\n \"name\":\"dbName\",\n \"dataTypeName\":\"string\",\n \"multiplicity\":{\n \"lower\":0,\n \"upper\":1,\n \"isUnique\":false\n },\n \"isComposite\":false,\n \"isUnique\":false,\n \"isIndexable\":true,\n \"reverseAttributeName\":null\n },\n {\n \"name\":\"tabName\",\n \"dataTypeName\":\"string\",\n \"multiplicity\":{\n \"lower\":0,\n \"upper\":1,\n \"isUnique\":false\n },\n \"isComposite\":false,\n \"isUnique\":false,\n \"isIndexable\":true,\n \"reverseAttributeName\":null\n }\n ]\n },\n \"rows\":[\n {\n \"$typeName$\":\"__tempQueryResultStruct6\",\n \"dbName\":\"Sales\",\n \"tabName\":\"sales_fact\"\n },\n {\n \"$typeName$\":\"__tempQueryResultStruct6\",\n \"dbName\":\"Sales\",\n \"tabName\":\"product_dim\"\n },\n {\n \"$typeName$\":\"__tempQueryResultStruct6\",\n \"dbName\":\"Sales\",\n \"tabName\":\"time_dim\"\n },\n {\n \"$typeName$\":\"__tempQueryResultStruct6\",\n \"dbName\":\"Sales\",\n \"tabName\":\"customer_dim\"\n },\n {\n \"$typeName$\":\"__tempQueryResultStruct6\",\n \"dbName\":\"Reporting\",\n \"tabName\":\"sales_fact_daily_mv\"\n },\n {\n \"$typeName$\":\"__tempQueryResultStruct6\",\n \"dbName\":\"Reporting\",\n \"tabName\":\"sales_fact_monthly_mv\"\n }\n ]\n}")
} }
test("testJoinAndSelect3") { test("testJoinAndSelect3") {
...@@ -121,7 +121,7 @@ class GremlinTest extends FunSuite with BeforeAndAfterAll { ...@@ -121,7 +121,7 @@ class GremlinTest extends FunSuite with BeforeAndAfterAll {
.or(id("db1").hasField("owner"))).field("Table").as("tab") .or(id("db1").hasField("owner"))).field("Table").as("tab")
.select(id("db1").field("name").as("dbName"), id("tab").field("name").as("tabName")), g .select(id("db1").field("name").as("dbName"), id("tab").field("name").as("tabName")), g
) )
validateJson(r, "{\n \"query\":\"DB as db1 where (db1.createTime > 0) and (db1.name = \\\"Reporting\\\") or db1 has owner Table as tab select db1.name as dbName, tab.name as tabName\",\n \"dataType\":{\n \"typeName\":\"__tempQueryResultStruct7\",\n \"attributeDefinitions\":[\n {\n \"name\":\"dbName\",\n \"dataTypeName\":\"string\",\n \"multiplicity\":{\n \"lower\":0,\n \"upper\":1,\n \"isUnique\":false\n },\n \"isComposite\":false,\n \"isUnique\":false,\n \"isIndexable\":true,\n \"reverseAttributeName\":null\n },\n {\n \"name\":\"tabName\",\n \"dataTypeName\":\"string\",\n \"multiplicity\":{\n \"lower\":0,\n \"upper\":1,\n \"isUnique\":false\n },\n \"isComposite\":false,\n \"isUnique\":false,\n \"isIndexable\":true,\n \"reverseAttributeName\":null\n }\n ]\n },\n \"rows\":[\n {\n \"$typeName$\":\"__tempQueryResultStruct7\",\n \"dbName\":\"Sales\",\n \"tabName\":\"sales_fact\"\n },\n {\n \"$typeName$\":\"__tempQueryResultStruct7\",\n \"dbName\":\"Sales\",\n \"tabName\":\"product_dim\"\n },\n {\n \"$typeName$\":\"__tempQueryResultStruct7\",\n \"dbName\":\"Sales\",\n \"tabName\":\"time_dim\"\n },\n {\n \"$typeName$\":\"__tempQueryResultStruct7\",\n \"dbName\":\"Sales\",\n \"tabName\":\"customer_dim\"\n },\n {\n \"$typeName$\":\"__tempQueryResultStruct7\",\n \"dbName\":\"Reporting\",\n \"tabName\":\"sales_fact_daily_mv\"\n },\n {\n \"$typeName$\":\"__tempQueryResultStruct7\",\n \"dbName\":\"Reporting\",\n \"tabName\":\"sales_fact_monthly_mv\"\n }\n ]\n}") validateJson(r, "{\n \"query\":\"DB as db1 where (createTime > 0) and (name = \\\"Reporting\\\") or DB as db1 has owner Table as tab select db1.name as dbName, tab.name as tabName\",\n \"dataType\":{\n \"typeName\":\"__tempQueryResultStruct7\",\n \"attributeDefinitions\":[\n {\n \"name\":\"dbName\",\n \"dataTypeName\":\"string\",\n \"multiplicity\":{\n \"lower\":0,\n \"upper\":1,\n \"isUnique\":false\n },\n \"isComposite\":false,\n \"isUnique\":false,\n \"isIndexable\":true,\n \"reverseAttributeName\":null\n },\n {\n \"name\":\"tabName\",\n \"dataTypeName\":\"string\",\n \"multiplicity\":{\n \"lower\":0,\n \"upper\":1,\n \"isUnique\":false\n },\n \"isComposite\":false,\n \"isUnique\":false,\n \"isIndexable\":true,\n \"reverseAttributeName\":null\n }\n ]\n },\n \"rows\":[\n {\n \"$typeName$\":\"__tempQueryResultStruct7\",\n \"dbName\":\"Sales\",\n \"tabName\":\"sales_fact\"\n },\n {\n \"$typeName$\":\"__tempQueryResultStruct7\",\n \"dbName\":\"Sales\",\n \"tabName\":\"product_dim\"\n },\n {\n \"$typeName$\":\"__tempQueryResultStruct7\",\n \"dbName\":\"Sales\",\n \"tabName\":\"time_dim\"\n },\n {\n \"$typeName$\":\"__tempQueryResultStruct7\",\n \"dbName\":\"Sales\",\n \"tabName\":\"customer_dim\"\n },\n {\n \"$typeName$\":\"__tempQueryResultStruct7\",\n \"dbName\":\"Reporting\",\n \"tabName\":\"sales_fact_daily_mv\"\n },\n {\n \"$typeName$\":\"__tempQueryResultStruct7\",\n \"dbName\":\"Reporting\",\n \"tabName\":\"sales_fact_monthly_mv\"\n }\n ]\n}")
} }
} }
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