http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/30711973/repository/src/test/scala/org/apache/hadoop/metadata/query/ExpressionTest.scala ---------------------------------------------------------------------- diff --git a/repository/src/test/scala/org/apache/hadoop/metadata/query/ExpressionTest.scala b/repository/src/test/scala/org/apache/hadoop/metadata/query/ExpressionTest.scala deleted file mode 100755 index 3e19fcf..0000000 --- a/repository/src/test/scala/org/apache/hadoop/metadata/query/ExpressionTest.scala +++ /dev/null @@ -1,171 +0,0 @@ -/* - * 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.hadoop.metadata.query - -import org.apache.hadoop.metadata.query.Expressions._ -import org.apache.hadoop.metadata.repository.BaseTest -import org.junit.{Before, Test} - -class ExpressionTest extends BaseTest { - - @Before - override def setup { - super.setup - - QueryTestsUtils.setupTypes - - } - - @Test def testClass: Unit = { - val e = QueryProcessor.validate(_class("DB")) - println(e) - } - - @Test def testFilter: Unit = { - val e = QueryProcessor.validate(_class("DB").where(id("name").`=`(string("Reporting")))) - println(e) - } - - @Test def testSelect: Unit = { - val e = QueryProcessor.validate(_class("DB").where(id("name").`=`(string("Reporting"))). - select(id("name"), id("owner"))) - println(e) - } - - @Test def testNegTypeTest: Unit = { - try { - val e = QueryProcessor.validate(_class("DB").where(id("name"))) - println(e) - } catch { - case e: ExpressionException if e.getMessage.endsWith("expression: DB where name") => () - } - } - - @Test def testIsTrait: Unit = { - val e = QueryProcessor.validate(_class("DB").where(isTrait("JdbcAccess"))) - println(e) - } - - @Test def testIsTraitNegative: Unit = { - try { - val e = QueryProcessor.validate(_class("DB").where(isTrait("Jdb"))) - println(e) - } catch { - case e: ExpressionException if e.getMessage.endsWith("not a TraitType, expression: is Jdb") => () - } - } - - @Test def testhasField: Unit = { - val e = QueryProcessor.validate(_class("DB").where(hasField("name"))) - println(e) - } - - @Test def testHasFieldNegative: Unit = { - try { - val e = QueryProcessor.validate(_class("DB").where(hasField("nam"))) - println(e) - } catch { - case e: ExpressionException if e.getMessage.endsWith("not a TraitType, expression: is Jdb") => () - } - } - - @Test def testFieldReference: Unit = { - val e = QueryProcessor.validate(_class("DB").field("Table")) - println(e) - } - - @Test def testNegFieldReference: Unit = { - try { - val e = QueryProcessor.validate(_class("DB").where(_class("LoadProcess").hasField("name"))) - println(e) - } catch { - case e: ExpressionException - if e.getMessage.endsWith("srcType of field doesn't match input type, expression: LoadProcess has name") => () - } - } - - @Test def testFieldReferenceRedundant: Unit = { - val e = QueryProcessor.validate(_class("DB").where(_class("DB").hasField("name"))) - println(e) - } - - @Test def testBackReference: Unit = { - val e = QueryProcessor.validate( - _class("DB").as("db1").field("Table").where(id("db1").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("db1").field("Table").as("tab").where((id("db1").field("createTime") + int(1) > int(0)) - .and(id("db1").field("name").`=`(string("Reporting")))).select(id("db1").field("name").as("dbName"), - id("tab").field("name").as("tabName")) - ) - println(e) - } - - @Test def testJoinAndSelect2: Unit = { - val e = QueryProcessor.validate( - _class("DB").as("db1").field("Table").as("tab").where((id("db1").field("createTime") + int(1) > int(0)) - .or(id("db1").field("name").`=`(string("Reporting")))) - .select(id("db1").field("name").as("dbName"), id("tab").field("name").as("tabName")) - ) - println(e) - } - - @Test def testJoinAndSelect3: Unit = { - val e = QueryProcessor.validate( - _class("DB").as("db1").field("Table").as("tab").where((id("db1").field("createTime") + int(1) > int(0)) - .and(id("db1").field("name").`=`(string("Reporting"))) - .or(id("db1").hasField("owner"))) - .select(id("db1").field("name").as("dbName"), id("tab").field("name").as("tabName")) - ) - println(e) - } - - @Test def testJoinAndSelect4: Unit = { - val e = QueryProcessor.validate( - _class("DB") as "db1" join "Table" as "tab" where ( - id("db1").field("createTime") + int(1) > int(0) and - (id("db1") `.` "name" `=` string("Reporting")) or - (id("db1") hasField "owner") - ) select( - id("db1") `.` "name" as "dbName", id("tab") `.` "name" as "tabName" - ) - ) - println(e) - } - - @Test def testLineageAll: Unit = { - val e = QueryProcessor.validate(_class("Table").loop(id("LoadProcess").field("outputTable"))) - println(e) - } -}
http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/30711973/repository/src/test/scala/org/apache/hadoop/metadata/query/GremlinTest.scala ---------------------------------------------------------------------- diff --git a/repository/src/test/scala/org/apache/hadoop/metadata/query/GremlinTest.scala b/repository/src/test/scala/org/apache/hadoop/metadata/query/GremlinTest.scala deleted file mode 100755 index 0880c69..0000000 --- a/repository/src/test/scala/org/apache/hadoop/metadata/query/GremlinTest.scala +++ /dev/null @@ -1,153 +0,0 @@ -/* - * 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.hadoop.metadata.query - -import com.thinkaurelius.titan.core.TitanGraph -import org.apache.hadoop.metadata.query.Expressions._ -import org.apache.hadoop.metadata.typesystem.types.TypeSystem -import org.junit.runner.RunWith -import org.scalatest._ -import Matchers._ -import org.scalatest.junit.JUnitRunner - -@RunWith(classOf[JUnitRunner]) -class GremlinTest extends FunSuite with BeforeAndAfterAll with BaseGremlinTest { - - var g: TitanGraph = null - - override def beforeAll() { - TypeSystem.getInstance().reset() - QueryTestsUtils.setupTypes - g = QueryTestsUtils.setupTestGraph - } - - override def afterAll() { - g.shutdown() - } - - test("testClass") { - val r = QueryProcessor.evaluate(_class("DB"), g) - validateJson(r, "{\n \"query\":\"DB\",\n \"dataType\":{\n \"superTypes\":[\n \n ],\n \"hierarchicalMetaTypeName\":\"org.apache.hadoop.metadata.typesystem.types.ClassType\",\n \"typeName\":\"DB\",\n \"attributeDefinitions\":[\n {\n \"name\":\"name\",\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\":\"owner\",\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\":\"createTime\",\n \"dataTypeName\":\"in t\",\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$\":\"DB\",\n \"$id$\":{\n \"id\":\"256\",\n \"$typeName$\":\"DB\",\n \"version\":0\n },\n \"owner\":\"John ETL\",\n \"name\":\"Sales\",\n \"createTime\":1000\n },\n {\n \"$typeName$\":\"DB\",\n \"$id$\":{\n \"id\":\"7168\",\n \"$typeName$\":\"DB\",\n \"version\":0\n },\n \"owner\":\"Jane BI\",\n \"name\":\"Reporting\",\n \"createTime\":1500\n }\n ]\n}") - } - - test("testName") { - val r = QueryProcessor.evaluate(_class("DB").field("name"), g) - validateJson(r, "{\n \"query\":\"DB.name\",\n \"dataType\":\"string\",\n \"rows\":[\n \"Sales\",\n \"Reporting\"\n ]\n}") - } - - test("testFilter") { - var r = QueryProcessor.evaluate(_class("DB").where(id("name").`=`(string("Reporting"))), g) - validateJson(r, "{\n \"query\":\"DB where (name = \\\"Reporting\\\")\",\n \"dataType\":{\n \"superTypes\":[\n \n ],\n \"hierarchicalMetaTypeName\":\"org.apache.hadoop.metadata.typesystem.types.ClassType\",\n \"typeName\":\"DB\",\n \"attributeDefinitions\":[\n {\n \"name\":\"name\",\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\":\"owner\",\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\":\"createTime\ ",\n \"dataTypeName\":\"int\",\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$\":\"DB\",\n \"$id$\":{\n \"id\":\"7168\",\n \"$typeName$\":\"DB\",\n \"version\":0\n },\n \"owner\":\"Jane BI\",\n \"name\":\"Reporting\",\n \"createTime\":1500\n }\n ]\n}") - } - - test("testFilter2") { - var r = QueryProcessor.evaluate(_class("DB").where(id("DB").field("name").`=`(string("Reporting"))), g) - validateJson(r, "{\n \"query\":\"DB where (name = \\\"Reporting\\\")\",\n \"dataType\":{\n \"superTypes\":[\n \n ],\n \"hierarchicalMetaTypeName\":\"org.apache.hadoop.metadata.typesystem.types.ClassType\",\n \"typeName\":\"DB\",\n \"attributeDefinitions\":[\n {\n \"name\":\"name\",\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\":\"owner\",\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\":\"createTime\ ",\n \"dataTypeName\":\"int\",\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$\":\"DB\",\n \"$id$\":{\n \"id\":\"7168\",\n \"$typeName$\":\"DB\",\n \"version\":0\n },\n \"owner\":\"Jane BI\",\n \"name\":\"Reporting\",\n \"createTime\":1500\n }\n ]\n}") - } - - - test("testSelect") { - val r = QueryProcessor.evaluate(_class("DB").where(id("name").`=`(string("Reporting"))). - select(id("name"), id("owner")), g) - validateJson(r, "{\n \"query\":\"DB where (name = \\\"Reporting\\\") as _src1 select _src1.name as _col_0, _src1.owner as _col_1\",\n \"dataType\":{\n \"typeName\":\"__tempQueryResultStruct1\",\n \"attributeDefinitions\":[\n {\n \"name\":\"_col_0\",\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\":\"_col_1\",\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$\":\"__tempQueryResultStruct1\",\n \"_col_1\":\"Jane BI\",\n \"_col_0\":\"Reporting\"\n }\n ]\n}") - } - - test("testIsTrait") { - val r = QueryProcessor.evaluate(_class("Table").where(isTrait("Dimension")), g) - validateJson(r, "{\n \"query\":\"Table where Table is Dimension\",\n \"dataType\":{\n \"superTypes\":[\n \n ],\n \"hierarchicalMetaTypeName\":\"org.apache.hadoop.metadata.typesystem.types.ClassType\",\n \"typeName\":\"Table\",\n \"attributeDefinitions\":[\n {\n \"name\":\"name\",\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\":\"db\",\n \"dataTypeName\":\"DB\",\n \"multiplicity\":{\n \"lower\":1,\n \"upper\":1,\n \"isUnique\":false\n },\n \"isComposite\":false,\n \"isUnique\":false,\n \"isIndexable\":true,\n \"reverseAttributeName\":null\n },\n {\n \"name\":\"sd\",\n \"dat aTypeName\":\"StorageDesc\",\n \"multiplicity\":{\n \"lower\":1,\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$\":\"Table\",\n \"$id$\":{\n \"id\":\"3328\",\n \"$typeName$\":\"Table\",\n \"version\":0\n },\n \"sd\":{\n \"id\":\"2304\",\n \"$typeName$\":\"StorageDesc\",\n \"version\":0\n },\n \"db\":{\n \"id\":\"256\",\n \"$typeName$\":\"DB\",\n \"version\":0\n },\n \"name\":\"product_dim\",\n \"$traits$\":{\n \"Dimension\":{\n \"$typeName$\":\"Dimension\"\n }\n }\n },\n {\n \"$typeName$\":\"Table\",\n \"$id$\":{\n \"id\":\"4864\",\n \"$typeName$\":\"Table\",\n \"version\":0\n },\n \" sd\":{\n \"id\":\"3840\",\n \"$typeName$\":\"StorageDesc\",\n \"version\":0\n },\n \"db\":{\n \"id\":\"256\",\n \"$typeName$\":\"DB\",\n \"version\":0\n },\n \"name\":\"time_dim\",\n \"$traits$\":{\n \"Dimension\":{\n \"$typeName$\":\"Dimension\"\n }\n }\n },\n {\n \"$typeName$\":\"Table\",\n \"$id$\":{\n \"id\":\"6656\",\n \"$typeName$\":\"Table\",\n \"version\":0\n },\n \"sd\":{\n \"id\":\"5376\",\n \"$typeName$\":\"StorageDesc\",\n \"version\":0\n },\n \"db\":{\n \"id\":\"256\",\n \"$typeName$\":\"DB\",\n \"version\":0\n },\n \"name\":\"customer_dim\",\n \"$traits$\":{\n \"Dimension\":{\n \"$typeName$\":\"Dimension\"\n }\n }\n }\n ]\n}") - } - - test("testhasField") { - val r = QueryProcessor.evaluate(_class("DB").where(hasField("name")), g) - validateJson(r, "{\n \"query\":\"DB where DB has name\",\n \"dataType\":{\n \"superTypes\":[\n \n ],\n \"hierarchicalMetaTypeName\":\"org.apache.hadoop.metadata.typesystem.types.ClassType\",\n \"typeName\":\"DB\",\n \"attributeDefinitions\":[\n {\n \"name\":\"name\",\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\":\"owner\",\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\":\"createTime\",\n \"d ataTypeName\":\"int\",\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$\":\"DB\",\n \"$id$\":{\n \"id\":\"256\",\n \"$typeName$\":\"DB\",\n \"version\":0\n },\n \"owner\":\"John ETL\",\n \"name\":\"Sales\",\n \"createTime\":1000\n },\n {\n \"$typeName$\":\"DB\",\n \"$id$\":{\n \"id\":\"7168\",\n \"$typeName$\":\"DB\",\n \"version\":0\n },\n \"owner\":\"Jane BI\",\n \"name\":\"Reporting\",\n \"createTime\":1500\n }\n ]\n}") - } - - test("testFieldReference") { - val r = QueryProcessor.evaluate(_class("DB").field("Table"), g) - validateJson(r, "{\n \"query\":\"DB Table\",\n \"dataType\":{\n \"superTypes\":[\n \n ],\n \"hierarchicalMetaTypeName\":\"org.apache.hadoop.metadata.typesystem.types.ClassType\",\n \"typeName\":\"Table\",\n \"attributeDefinitions\":[\n {\n \"name\":\"name\",\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\":\"db\",\n \"dataTypeName\":\"DB\",\n \"multiplicity\":{\n \"lower\":1,\n \"upper\":1,\n \"isUnique\":false\n },\n \"isComposite\":false,\n \"isUnique\":false,\n \"isIndexable\":true,\n \"reverseAttributeName\":null\n },\n {\n \"name\":\"sd\",\n \"dataTypeName\":\"StorageD esc\",\n \"multiplicity\":{\n \"lower\":1,\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$\":\"Table\",\n \"$id$\":{\n \"id\":\"2048\",\n \"$typeName$\":\"Table\",\n \"version\":0\n },\n \"sd\":{\n \"id\":\"512\",\n \"$typeName$\":\"StorageDesc\",\n \"version\":0\n },\n \"db\":{\n \"id\":\"256\",\n \"$typeName$\":\"DB\",\n \"version\":0\n },\n \"name\":\"sales_fact\"\n },\n {\n \"$typeName$\":\"Table\",\n \"$id$\":{\n \"id\":\"3328\",\n \"$typeName$\":\"Table\",\n \"version\":0\n },\n \"sd\":{\n \"id\":\"2304\",\n \"$typeName$\":\"StorageDesc\",\n \"version\":0\n },\n \"db\":{\n \"id\":\"256\",\n \"$typeName$\":\"DB\",\n \"version\":0\n },\n \"name\":\"product_dim\",\n \"$traits$\":{\n \"Dimension\":{\n \"$typeName$\":\"Dimension\"\n }\n }\n },\n {\n \"$typeName$\":\"Table\",\n \"$id$\":{\n \"id\":\"4864\",\n \"$typeName$\":\"Table\",\n \"version\":0\n },\n \"sd\":{\n \"id\":\"3840\",\n \"$typeName$\":\"StorageDesc\",\n \"version\":0\n },\n \"db\":{\n \"id\":\"256\",\n \"$typeName$\":\"DB\",\n \"version\":0\n },\n \"name\":\"time_dim\",\n \"$traits$\":{\n \"Dimension\":{\n \"$typeName$\":\"Dimension\"\n }\n }\n },\n {\n \"$typeName$\":\"Table\",\n \"$id$\":{\n \"id\":\"6656\",\n \"$typeName$\":\"Table\",\n \"version\":0\n },\n \"sd\":{\n \"id\":\"5376\",\n \"$typeName$\":\"StorageDesc\",\n \"ver sion\":0\n },\n \"db\":{\n \"id\":\"256\",\n \"$typeName$\":\"DB\",\n \"version\":0\n },\n \"name\":\"customer_dim\",\n \"$traits$\":{\n \"Dimension\":{\n \"$typeName$\":\"Dimension\"\n }\n }\n },\n {\n \"$typeName$\":\"Table\",\n \"$id$\":{\n \"id\":\"8960\",\n \"$typeName$\":\"Table\",\n \"version\":0\n },\n \"sd\":{\n \"id\":\"7424\",\n \"$typeName$\":\"StorageDesc\",\n \"version\":0\n },\n \"db\":{\n \"id\":\"7168\",\n \"$typeName$\":\"DB\",\n \"version\":0\n },\n \"name\":\"sales_fact_daily_mv\"\n },\n {\n \"$typeName$\":\"Table\",\n \"$id$\":{\n \"id\":\"12800\",\n \"$typeName$\":\"Table\",\n \"version\":0\n },\n \"sd\":{\n \"id\":\"11264\",\n \"$typeName$\":\"StorageDesc\",\n \"version\":0\n },\n \"db\":{\n \"id\ ":\"7168\",\n \"$typeName$\":\"DB\",\n \"version\":0\n },\n \"name\":\"sales_fact_monthly_mv\"\n }\n ]\n}") - } - - test("testBackReference") { - val r = QueryProcessor.evaluate( - _class("DB").as("db").field("Table").where(id("db").field("name").`=`(string("Reporting"))), g) - validateJson(r, null) - } - - test("testArith") { - val r = QueryProcessor.evaluate(_class("DB").where(id("name").`=`(string("Reporting"))). - select(id("name"), id("createTime") + int(1)), g) - validateJson(r, "{\n \"query\":\"DB where (name = \\\"Reporting\\\") as _src1 select _src1.name as _col_0, (_src1.createTime + 1) as _col_1\",\n \"dataType\":{\n \"typeName\":\"__tempQueryResultStruct3\",\n \"attributeDefinitions\":[\n {\n \"name\":\"_col_0\",\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\":\"_col_1\",\n \"dataTypeName\":\"int\",\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$\":\"__tempQueryResultStru ct3\",\n \"_col_1\":1501,\n \"_col_0\":\"Reporting\"\n }\n ]\n}") - } - - test("testComparisonLogical") { - val r = QueryProcessor.evaluate(_class("DB").where(id("name").`=`(string("Reporting")). - and(id("createTime") > int(0))), g) - validateJson(r, "{\n \"query\":\"DB where (name = \\\"Reporting\\\") and (createTime > 0)\",\n \"dataType\":{\n \"superTypes\":[\n \n ],\n \"hierarchicalMetaTypeName\":\"org.apache.hadoop.metadata.typesystem.types.ClassType\",\n \"typeName\":\"DB\",\n \"attributeDefinitions\":[\n {\n \"name\":\"name\",\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\":\"owner\",\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\":\"createTime\",\n \"dataTypeName\":\"int\",\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$\":\"DB\",\n \"$id$\":{\n \"id\":\"7168\",\n \"$typeName$\":\"DB\",\n \"version\":0\n },\n \"owner\":\"Jane BI\",\n \"name\":\"Reporting\",\n \"createTime\":1500\n }\n ]\n}") - } - - test("testJoinAndSelect1") { - val r = QueryProcessor.evaluate( - _class("DB").as("db1").where(id("name").`=`(string("Sales"))).field("Table").as("tab"). - where((isTrait("Dimension"))). - 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}") - } - - test("testJoinAndSelect2") { - val r = QueryProcessor.evaluate( - _class("DB").as("db1").where((id("db1").field("createTime") > int(0)) - .or(id("name").`=`(string("Reporting")))).field("Table").as("tab") - .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}") - } - - test("testJoinAndSelect3") { - val r = QueryProcessor.evaluate( - _class("DB").as("db1").where((id("db1").field("createTime") > int(0)) - .and(id("db1").field("name").`=`(string("Reporting"))) - .or(id("db1").hasField("owner"))).field("Table").as("tab") - .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 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}") - } - - test("testJoinAndSelect4") { - val r = QueryProcessor.evaluate( - _class("DB").as("db1").where(id("name").`=`(string("Sales"))).field("Table").as("tab"). - where((isTrait("Dimension"))). - select(id("db1").as("dbO"), 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 as dbO, tab.name as tabName\",\n \"dataType\":{\n \"typeName\":\"\",\n \"attributeDefinitions\":[\n {\n \"name\":\"dbO\",\n \"dataTypeName\":\"DB\",\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$\":\"\",\n \"dbO\":{\n \"id\":\"256\",\n \"$typeName$\":\"DB\",\n \"version\":0\n },\n \"tabName\":\"product_dim\"\n },\n {\n \"$typeName$\":\"\",\n \"dbO\":{\n \"id\":\"256\",\n \"$typeName$\":\"DB\",\n \"version\":0\n },\n \"tabName\":\"time_dim\"\n },\n {\n \"$typeName$\":\"\",\n \"dbO\":{\n \"id\":\"256\",\n \"$typeName$\":\"DB\",\n \"version\":0\n },\n \"tabName\":\"customer_dim\"\n }\n ]\n}") - } - - test("testNegativeInvalidType") { - val p = new QueryParser - val e = p("from blah").right.get - an [ExpressionException] should be thrownBy QueryProcessor.evaluate(e, g) - } - - test("Bug37860") { - val p = new QueryParser - val e = p("Table as t where name = 'sales_fact' db where name = 'Sales' and owner = 'John ETL' select t").right.get - val r = QueryProcessor.evaluate(e, g) - validateJson(r) - } -} http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/30711973/repository/src/test/scala/org/apache/hadoop/metadata/query/GremlinTest2.scala ---------------------------------------------------------------------- diff --git a/repository/src/test/scala/org/apache/hadoop/metadata/query/GremlinTest2.scala b/repository/src/test/scala/org/apache/hadoop/metadata/query/GremlinTest2.scala deleted file mode 100755 index 4eb5b1a..0000000 --- a/repository/src/test/scala/org/apache/hadoop/metadata/query/GremlinTest2.scala +++ /dev/null @@ -1,136 +0,0 @@ -/* - * 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.hadoop.metadata.query - -import com.thinkaurelius.titan.core.TitanGraph -import org.apache.hadoop.metadata.query.Expressions._ -import org.apache.hadoop.metadata.typesystem.types.TypeSystem -import org.junit.runner.RunWith -import org.scalatest._ -import Matchers._ -import org.scalatest.junit.JUnitRunner - -@RunWith(classOf[JUnitRunner]) -class GremlinTest2 extends FunSuite with BeforeAndAfterAll with BaseGremlinTest { - - var g: TitanGraph = null - - override def beforeAll() { - TypeSystem.getInstance().reset() - QueryTestsUtils.setupTypes - g = QueryTestsUtils.setupTestGraph - } - - override def afterAll() { - g.shutdown() - } - - test("testTraitSelect") { - val r = QueryProcessor.evaluate(_class("Table").as("t").join("Dimension").as("dim").select(id("t"), id("dim")), g) - validateJson(r, "{\n \"query\":\"Table as t.Dimension as dim select t as _col_0, dim as _col_1\",\n \"dataType\":{\n \"typeName\":\"\",\n \"attributeDefinitions\":[\n {\n \"name\":\"_col_0\",\n \"dataTypeName\":\"Table\",\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\":\"_col_1\",\n \"dataTypeName\":\"Dimension\",\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$\":\"\",\n \"_col_1\":{\n \"$typeName$\":\"Dimension\"\n },\n \"_col_0\" :{\n \"id\":\"3328\",\n \"$typeName$\":\"Table\",\n \"version\":0\n }\n },\n {\n \"$typeName$\":\"\",\n \"_col_1\":{\n \"$typeName$\":\"Dimension\"\n },\n \"_col_0\":{\n \"id\":\"4864\",\n \"$typeName$\":\"Table\",\n \"version\":0\n }\n },\n {\n \"$typeName$\":\"\",\n \"_col_1\":{\n \"$typeName$\":\"Dimension\"\n },\n \"_col_0\":{\n \"id\":\"6656\",\n \"$typeName$\":\"Table\",\n \"version\":0\n }\n }\n ]\n}") - } - - test("testTrait") { - val r = QueryProcessor.evaluate(_trait("Dimension"), g) - validateJson(r) - } - - test("testTraitInstance") { - val r = QueryProcessor.evaluate(_trait("Dimension").traitInstance(), g) - validateJson(r) - } - - test("testInstanceAddedToFilter") { - val r = QueryProcessor.evaluate(_trait("Dimension").hasField("typeName"), g) - validateJson(r) - } - - test("testInstanceFilter") { - val r = QueryProcessor.evaluate(_trait("Dimension").traitInstance().hasField("name"), g) - validateJson(r) - } - - test("testLineageWithPath") { - val r = QueryProcessor.evaluate(_class("Table").loop(id("LoadProcess").field("outputTable")).path(), g) - validateJson(r) - } - - test("testLineageAllSelectWithPath") { - val r = QueryProcessor.evaluate(_class("Table").as("src").loop(id("LoadProcess").field("outputTable")).as("dest"). - select(id("src").field("name").as("srcTable"), id("dest").field("name").as("destTable")).path(), g) - validateJson(r) - } - - test("testLineageAllSelectWithPathFromParser") { - val p = new QueryParser - val e = p("Table as src loop (LoadProcess outputTable) as dest " + - "select src.name as srcTable, dest.name as destTable withPath").right.get - //Table as src loop (LoadProcess where LoadProcess.outputTable) as dest select src.name as srcTable, dest.name as destTable withPath - val r = QueryProcessor.evaluate(e, g) - validateJson(r) - } - - test("testLineageAllSelectWithPathFromParser2") { - val p = new QueryParser - - val e = p("Table as src loop (`LoadProcess->outputTable` inputTables) as dest " + - "select src.name as srcTable, dest.name as destTable withPath").right.get - val r = QueryProcessor.evaluate(e, g) - validateJson(r) - } - - test("testHighLevelLineage") { - val r = HiveLineageQuery("Table", "sales_fact_monthly_mv", - "LoadProcess", - "inputTables", - "outputTable", - None, Some(List("name")), true, GraphPersistenceStrategy1, g).evaluate() - validateJson(r) - } - - test("testHighLevelLineageReturnGraph") { - val r = HiveLineageQuery("Table", "sales_fact_monthly_mv", - "LoadProcess", - "inputTables", - "outputTable", - None, Some(List("name")), true, GraphPersistenceStrategy1, g).graph - - println(r.toInstanceJson) - //validateJson(r) - } - - test("testHighLevelWhereUsed") { - val r = HiveWhereUsedQuery("Table", "sales_fact", - "LoadProcess", - "inputTables", - "outputTable", - None, Some(List("name")), true, GraphPersistenceStrategy1, g).evaluate() - validateJson(r) - } - - test("testHighLevelWhereUsedReturnGraph") { - val r = HiveWhereUsedQuery("Table", "sales_fact", - "LoadProcess", - "inputTables", - "outputTable", - None, Some(List("name")), true, GraphPersistenceStrategy1, g).graph - println(r.toInstanceJson) - } - -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/30711973/repository/src/test/scala/org/apache/hadoop/metadata/query/HiveTitanSample.scala ---------------------------------------------------------------------- diff --git a/repository/src/test/scala/org/apache/hadoop/metadata/query/HiveTitanSample.scala b/repository/src/test/scala/org/apache/hadoop/metadata/query/HiveTitanSample.scala deleted file mode 100755 index a7d2751..0000000 --- a/repository/src/test/scala/org/apache/hadoop/metadata/query/HiveTitanSample.scala +++ /dev/null @@ -1,345 +0,0 @@ -/* - * 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.hadoop.metadata.query - -import java.io.File -import java.util.UUID -import java.util.concurrent.atomic.AtomicInteger -import javax.script.{Bindings, ScriptEngine, ScriptEngineManager} - -import com.thinkaurelius.titan.core.TitanGraph -import com.typesafe.config.ConfigFactory -import org.apache.commons.io.FileUtils - -import scala.collection.mutable.ArrayBuffer - -object HiveTitanSample { - - private var nextVertexId: AtomicInteger = new AtomicInteger(0) - private var nextEdgeId: AtomicInteger = new AtomicInteger(1000) - - trait Vertex { - val _id: String - - def id = _id - val version = 0 - val guid = s"""${UUID.randomUUID()}""".stripMargin - - def addEdge(to: Vertex, label: String, edges: ArrayBuffer[String]): Unit = { - edges += - s"""{"_id" : "${nextEdgeId.incrementAndGet()}", "_type" : "edge", "_inV" : "${to.id}", "_outV" : "$id", "_label" : "$label"}""" - } - - def toGSon(vertices: ArrayBuffer[String], - edges: ArrayBuffer[String]): Unit = { - - val sb = new StringBuilder - sb.append( s"""{"typeName" : "${this.getClass.getSimpleName}", "_type" : "vertex"""") - - this.getClass.getDeclaredFields filter (_.getName != "traits") foreach { f => - f.setAccessible(true) - var fV = f.get(this) - fV = fV match { - case _: String => s""""$fV"""" - case _ => fV - } - - fV match { - case x: Vertex => addEdge(x, s"${this.getClass.getSimpleName}.${f.getName}", edges) - case l: List[_] => l.foreach(x => addEdge(x.asInstanceOf[Vertex], - s"${this.getClass.getSimpleName}.${f.getName}", edges)) - case _ => sb.append( s""", "${f.getName}" : $fV""") - sb.append( s""", "${this.getClass.getSimpleName}.${f.getName}" : $fV""") - } - } - - this.getClass.getDeclaredFields filter (_.getName == "traits") foreach { f => - f.setAccessible(true) - var traits = f.get(this).asInstanceOf[Option[List[Trait]]] - - if (traits.isDefined) { - val fV = traits.get.map(_.getClass.getSimpleName).mkString(",") - sb.append( s""", "traitNames" : "$fV"""") - } - } - - sb.append("}") - vertices += sb.toString() - } - } - - trait Trait extends Vertex - - trait Struct extends Vertex - - trait Instance extends Vertex { - val traits: Option[List[Trait]] - - override def toGSon(vertices: ArrayBuffer[String], - edges: ArrayBuffer[String]): Unit = { - super.toGSon(vertices, edges) - - if (traits.isDefined) { - traits.get foreach { t => - t.toGSon(vertices, edges) - addEdge(t, s"${this.getClass.getSimpleName}.${t.getClass.getSimpleName}", edges) - } - } - } - - } - - case class JdbcAccess(_id: String = "" + nextVertexId.incrementAndGet()) extends Trait - - case class PII(_id: String = "" + nextVertexId.incrementAndGet()) extends Trait - - case class Dimension(_id: String = "" + nextVertexId.incrementAndGet()) extends Trait - - case class Metric(_id: String = "" + nextVertexId.incrementAndGet()) extends Trait - - case class ETL(_id: String = "" + nextVertexId.incrementAndGet()) extends Trait - - - case class DB(name: String, owner: String, createTime: Int, traits: Option[List[Trait]] = None, - _id: String = "" + nextVertexId.incrementAndGet()) extends Instance - - case class StorageDescriptor(inputFormat: String, outputFormat: String, - _id: String = "" + nextVertexId.incrementAndGet()) extends Struct - - case class Column(name: String, dataType: String, sd: StorageDescriptor, - traits: Option[List[Trait]] = None, - _id: String = "" + nextVertexId.incrementAndGet()) extends Instance - - case class Table(name: String, db: DB, sd: StorageDescriptor, - traits: Option[List[Trait]] = None, - _id: String = "" + nextVertexId.incrementAndGet()) extends Instance - - case class TableDef(name: String, db: DB, inputFormat: String, outputFormat: String, - columns: List[(String, String, Option[List[Trait]])], - traits: Option[List[Trait]] = None) { - val sd = StorageDescriptor(inputFormat, outputFormat) - val colDefs = columns map { c => - Column(c._1, c._2, sd, c._3) - } - val tablDef = Table(name, db, sd, traits) - - def toGSon(vertices: ArrayBuffer[String], - edges: ArrayBuffer[String]): Unit = { - sd.toGSon(vertices, edges) - colDefs foreach { - _.toGSon(vertices, edges) - } - tablDef.toGSon(vertices, edges) - } - } - - case class LoadProcess(name: String, inputTables: List[Vertex], - outputTable: Vertex, - traits: Option[List[Trait]] = None, - _id: String = "" + nextVertexId.incrementAndGet()) extends Instance - - case class View(name: String, db: DB, inputTables: List[Vertex], - traits: Option[List[Trait]] = None, - _id: String = "" + nextVertexId.incrementAndGet()) extends Instance - - val salesDB = DB("Sales", "John ETL", 1000) - val salesFact = TableDef("sales_fact", - salesDB, - "TextInputFormat", - "TextOutputFormat", - List( - ("time_id", "int", None), - ("product_id", "int", None), - ("customer_id", "int", None), - ("sales", "double", Some(List(Metric()))) - )) - val productDim = TableDef("product_dim", - salesDB, - "TextInputFormat", - "TextOutputFormat", - List( - ("product_id", "int", None), - ("product_name", "string", None), - ("brand_name", "string", None) - ), - Some(List(Dimension()))) - val timeDim = TableDef("time_dim", - salesDB, - "TextInputFormat", - "TextOutputFormat", - List( - ("time_id", "int", None), - ("dayOfYear", "int", None), - ("weekDay", "string", None) - ), - Some(List(Dimension()))) - val customerDim = TableDef("customer_dim", - salesDB, - "TextInputFormat", - "TextOutputFormat", - List( - ("customer_id", "int", None), - ("name", "int", None), - ("address", "string", Some(List(PII()))) - ), - Some(List(Dimension()))) - - val reportingDB = DB("Reporting", "Jane BI", 1500) - val salesFactDaily = TableDef("sales_fact_daily_mv", - reportingDB, - "TextInputFormat", - "TextOutputFormat", - List( - ("time_id", "int", None), - ("product_id", "int", None), - ("customer_id", "int", None), - ("sales", "double", Some(List(Metric()))) - )) - val loadSalesFactDaily = LoadProcess("loadSalesDaily", - List(salesFact.tablDef, timeDim.tablDef), salesFactDaily.tablDef, - Some(List(ETL()))) - - - val productDimView = View("product_dim_view", reportingDB, - List(productDim.tablDef), - Some(List(Dimension(), JdbcAccess()))) - - val customerDimView = View("customer_dim_view", reportingDB, - List(customerDim.tablDef), - Some(List(Dimension(), JdbcAccess()))) - - val salesFactMonthly = TableDef("sales_fact_monthly_mv", - reportingDB, - "TextInputFormat", - "TextOutputFormat", - List( - ("time_id", "int", None), - ("product_id", "int", None), - ("customer_id", "int", None), - ("sales", "double", Some(List(Metric()))) - )) - val loadSalesFactMonthly = LoadProcess("loadSalesMonthly", - List(salesFactDaily.tablDef), salesFactMonthly.tablDef, - Some(List(ETL()))) - - - val vertices: ArrayBuffer[String] = new ArrayBuffer[String]() - val edges: ArrayBuffer[String] = new ArrayBuffer[String]() - - salesDB.toGSon(vertices, edges) - salesFact.toGSon(vertices, edges) - productDim.toGSon(vertices, edges) - timeDim.toGSon(vertices, edges) - customerDim.toGSon(vertices, edges) - - reportingDB.toGSon(vertices, edges) - salesFactDaily.toGSon(vertices, edges) - loadSalesFactDaily.toGSon(vertices, edges) - productDimView.toGSon(vertices, edges) - customerDimView.toGSon(vertices, edges) - salesFactMonthly.toGSon(vertices, edges) - loadSalesFactMonthly.toGSon(vertices, edges) - - def toGSon(): String = { - s"""{ - "mode":"NORMAL", - "vertices": ${vertices.mkString("[\n\t", ",\n\t", "\n]")}, - "edges": ${edges.mkString("[\n\t", ",\n\t", "\n]")} - } - """.stripMargin - } - - def writeGson(fileName: String): Unit = { - FileUtils.writeStringToFile(new File(fileName), toGSon()) - } - - val GremlinQueries = List( - // 1. List all DBs - """g.V.has("typeName", "DB")""", - - // 2. List all DB nmes - """g.V.has("typeName", "DB").name""", - - // 3. List all Tables in Reporting DB - """g.V.has("typeName", "DB").has("name", "Reporting").inE("Table.db").outV""", - """g.V.has("typeName", "DB").as("db").inE("Table.db").outV.and(_().back("db").has("name", "Reporting"))""", - - // 4. List all Tables in Reporting DB, list as D.name, Tbl.name - """ - g.V.has("typeName", "DB").has("name", "Reporting").as("db").inE("Table.db").outV.as("tbl").select{it.name}{it.name} - """.stripMargin, - - // 5. List all tables that are Dimensions and have the TextInputFormat - """ - g.V.as("v").and(_().outE("Table.Dimension"), _().out("Table.sd").has("inputFormat", "TextInputFormat")).name - """.stripMargin, - - // 6. List all tables that are Dimensions or have the TextInputFormat - """ - g.V.as("v").or(_().outE("Table.Dimension"), _().out("Table.sd").has("inputFormat", "TextInputFormat")).name - """.stripMargin, - - // 7. List tables that have at least 1 PII column - """ - g.V.has("typeName", "Table").as("tab").out("Table.sd").in("Column.sd").as("column"). \ - out("Column.PII").select.groupBy{it.getColumn("tab")}{it.getColumn("column")}{[ "c" : it.size]}.cap.scatter.filter{it.value.c > 0}. \ - transform{it.key}.name """.stripMargin - - // 7.a from Table as tab -> g.V.has("typeName", "Table").as("tab") - // 7.b sd.Column as column -> out("Table.sd").in("Column.sd").as("column") - // 7.c is PII -> out("Column.PII") - // 7.d select tab, column -> select{it}{it} - // 7.e groupBy tab compute count(column) as c - // 7.f where c > 0 - - // 7.a Alias(Type("Table"), "tab") - // 7b. Field("sd", Alias(Type("Table"), "tab")) - // Alias(Field("Column", Field("sd", Alias(Type("Table"), "tab"))), "column") - // 7.c Filter(is("PII"), Alias(Field("Column", Field("sd", Alias(Type("Table"), "tab"))), "column")) - // 7.d - ) -} - -object TestApp extends App with GraphUtils { - - var conf = ConfigFactory.load() - conf = conf.getConfig("graphRepo") - val g: TitanGraph = titanGraph(conf) - val manager: ScriptEngineManager = new ScriptEngineManager - val engine: ScriptEngine = manager.getEngineByName("gremlin-groovy") - val bindings: Bindings = engine.createBindings - bindings.put("g", g) - - val hiveGraphFile = FileUtils.getTempDirectory().getPath + File.separator + System.nanoTime() + ".gson" - HiveTitanSample.writeGson(hiveGraphFile) - bindings.put("hiveGraphFile", hiveGraphFile) - - try { - engine.eval("g.loadGraphSON(hiveGraphFile)", bindings) - - println(engine.eval("g.V.typeName.toList()", bindings)) - - HiveTitanSample.GremlinQueries.foreach { q => - println(q) - println("Result: " + engine.eval(q + ".toList()", bindings)) - } - } finally { - g.shutdown() - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/30711973/repository/src/test/scala/org/apache/hadoop/metadata/query/LexerTest.scala ---------------------------------------------------------------------- diff --git a/repository/src/test/scala/org/apache/hadoop/metadata/query/LexerTest.scala b/repository/src/test/scala/org/apache/hadoop/metadata/query/LexerTest.scala deleted file mode 100755 index d0adc8e..0000000 --- a/repository/src/test/scala/org/apache/hadoop/metadata/query/LexerTest.scala +++ /dev/null @@ -1,48 +0,0 @@ -/* - * 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.hadoop.metadata.query - -import org.junit.{Assert, Test} - -import scala.util.parsing.input.CharArrayReader - -class LexerTest { - - def scan(p: QueryParser, str: String): p.lexical.ParseResult[_] = { - val l = p.lexical - var s: l.Input = new CharArrayReader(str.toCharArray) - var r = (l.whitespace.? ~ l.token)(s) - s = r.next - - while (r.successful && !s.atEnd) { - s = r.next - if (!s.atEnd) { - r = (l.whitespace.? ~ l.token)(s) - } - } - r.asInstanceOf[p.lexical.ParseResult[_]] - } - - @Test def testSimple { - val p = new QueryParser - val r = scan(p, """DB where db1.name""") - Assert.assertTrue(r.successful) - - } -} http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/30711973/repository/src/test/scala/org/apache/hadoop/metadata/query/LineageQueryTest.scala ---------------------------------------------------------------------- diff --git a/repository/src/test/scala/org/apache/hadoop/metadata/query/LineageQueryTest.scala b/repository/src/test/scala/org/apache/hadoop/metadata/query/LineageQueryTest.scala deleted file mode 100755 index 15a644f..0000000 --- a/repository/src/test/scala/org/apache/hadoop/metadata/query/LineageQueryTest.scala +++ /dev/null @@ -1,515 +0,0 @@ -/* - * 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.hadoop.metadata.query - -import com.thinkaurelius.titan.core.TitanGraph -import org.apache.hadoop.metadata.query.Expressions._ -import org.apache.hadoop.metadata.typesystem.types.TypeSystem -import org.junit.runner.RunWith -import org.scalatest.junit.JUnitRunner -import org.scalatest.{Assertions, BeforeAndAfterAll, FunSuite} - -@RunWith(classOf[JUnitRunner]) -class LineageQueryTest extends FunSuite with BeforeAndAfterAll { - - var g: TitanGraph = null - - override def beforeAll() { - TypeSystem.getInstance().reset() - QueryTestsUtils.setupTypes - g = QueryTestsUtils.setupTestGraph - } - - override def afterAll() { - g.shutdown() - } - - val STRUCT_NAME_REGEX = (TypeUtils.TEMP_STRUCT_NAME_PREFIX + "\\d+").r - val PREFIX_SPACES_REGEX = ("\\n\\s*").r - - def validateJson(r: GremlinQueryResult, expected: String = null): Unit = { - val rJ = r.toJson - if (expected != null) { - var a = STRUCT_NAME_REGEX.replaceAllIn(rJ, "") - a = PREFIX_SPACES_REGEX.replaceAllIn(a, "") - var b = STRUCT_NAME_REGEX.replaceAllIn(expected, "") - b = PREFIX_SPACES_REGEX.replaceAllIn(b, "") - Assertions.assert(a == b) - } else { - println(rJ) - } - } - - test("testInputTables") { - val r = QueryProcessor.evaluate(_class("LoadProcess").field("inputTables"), g) - val x = r.toJson - validateJson(r, """{ - "query":"LoadProcess inputTables", - "dataType":{ - "superTypes":[ - - ], - "hierarchicalMetaTypeName":"org.apache.hadoop.metadata.typesystem.types.ClassType", - "typeName":"Table", - "attributeDefinitions":[ - { - "name":"name", - "dataTypeName":"string", - "multiplicity":{ - "lower":0, - "upper":1, - "isUnique":false - }, - "isComposite":false, - "isUnique":false, - "isIndexable":true, - "reverseAttributeName":null - }, - { - "name":"db", - "dataTypeName":"DB", - "multiplicity":{ - "lower":1, - "upper":1, - "isUnique":false - }, - "isComposite":false, - "isUnique":false, - "isIndexable":true, - "reverseAttributeName":null - }, - { - "name":"sd", - "dataTypeName":"StorageDesc", - "multiplicity":{ - "lower":1, - "upper":1, - "isUnique":false - }, - "isComposite":false, - "isUnique":false, - "isIndexable":true, - "reverseAttributeName":null - } - ] - }, - "rows":[ - { - "$typeName$":"Table", - "$id$":{ - "id":"2048", - "$typeName$":"Table", - "version":0 - }, - "sd":{ - "id":"512", - "$typeName$":"StorageDesc", - "version":0 - }, - "db":{ - "id":"256", - "$typeName$":"DB", - "version":0 - }, - "name":"sales_fact" - }, - { - "$typeName$":"Table", - "$id$":{ - "id":"4864", - "$typeName$":"Table", - "version":0 - }, - "sd":{ - "id":"3840", - "$typeName$":"StorageDesc", - "version":0 - }, - "db":{ - "id":"256", - "$typeName$":"DB", - "version":0 - }, - "name":"time_dim", - "$traits$":{ - "Dimension":{ - "$typeName$":"Dimension" - } - } - }, - { - "$typeName$":"Table", - "$id$":{ - "id":"8960", - "$typeName$":"Table", - "version":0 - }, - "sd":{ - "id":"7424", - "$typeName$":"StorageDesc", - "version":0 - }, - "db":{ - "id":"7168", - "$typeName$":"DB", - "version":0 - }, - "name":"sales_fact_daily_mv" - } - ] -}""") - } - - test("testLoadProcessOut") { - val r = QueryProcessor.evaluate(_class("Table").field("LoadProcess").field("outputTable"), g) - validateJson(r, null) - } - - test("testLineageAll") { - val r = QueryProcessor.evaluate(_class("Table").loop(id("LoadProcess").field("outputTable")), g) - validateJson(r, """{ - "query":"Table as _loop0 loop (LoadProcess outputTable)", - "dataType":{ - "superTypes":[ - - ], - "hierarchicalMetaTypeName":"org.apache.hadoop.metadata.typesystem.types.ClassType", - "typeName":"Table", - "attributeDefinitions":[ - { - "name":"name", - "dataTypeName":"string", - "multiplicity":{ - "lower":0, - "upper":1, - "isUnique":false - }, - "isComposite":false, - "isUnique":false, - "isIndexable":true, - "reverseAttributeName":null - }, - { - "name":"db", - "dataTypeName":"DB", - "multiplicity":{ - "lower":1, - "upper":1, - "isUnique":false - }, - "isComposite":false, - "isUnique":false, - "isIndexable":true, - "reverseAttributeName":null - }, - { - "name":"sd", - "dataTypeName":"StorageDesc", - "multiplicity":{ - "lower":1, - "upper":1, - "isUnique":false - }, - "isComposite":false, - "isUnique":false, - "isIndexable":true, - "reverseAttributeName":null - } - ] - }, - "rows":[ - { - "$typeName$":"Table", - "$id$":{ - "id":"8960", - "$typeName$":"Table", - "version":0 - }, - "sd":{ - "id":"7424", - "$typeName$":"StorageDesc", - "version":0 - }, - "db":{ - "id":"7168", - "$typeName$":"DB", - "version":0 - }, - "name":"sales_fact_daily_mv" - }, - { - "$typeName$":"Table", - "$id$":{ - "id":"12800", - "$typeName$":"Table", - "version":0 - }, - "sd":{ - "id":"11264", - "$typeName$":"StorageDesc", - "version":0 - }, - "db":{ - "id":"7168", - "$typeName$":"DB", - "version":0 - }, - "name":"sales_fact_monthly_mv" - }, - { - "$typeName$":"Table", - "$id$":{ - "id":"8960", - "$typeName$":"Table", - "version":0 - }, - "sd":{ - "id":"7424", - "$typeName$":"StorageDesc", - "version":0 - }, - "db":{ - "id":"7168", - "$typeName$":"DB", - "version":0 - }, - "name":"sales_fact_daily_mv" - }, - { - "$typeName$":"Table", - "$id$":{ - "id":"12800", - "$typeName$":"Table", - "version":0 - }, - "sd":{ - "id":"11264", - "$typeName$":"StorageDesc", - "version":0 - }, - "db":{ - "id":"7168", - "$typeName$":"DB", - "version":0 - }, - "name":"sales_fact_monthly_mv" - }, - { - "$typeName$":"Table", - "$id$":{ - "id":"12800", - "$typeName$":"Table", - "version":0 - }, - "sd":{ - "id":"11264", - "$typeName$":"StorageDesc", - "version":0 - }, - "db":{ - "id":"7168", - "$typeName$":"DB", - "version":0 - }, - "name":"sales_fact_monthly_mv" - } - ] -}""") - } - - test("testLineageAllSelect") { - val r = QueryProcessor.evaluate(_class("Table").as("src").loop(id("LoadProcess").field("outputTable")).as("dest"). - select(id("src").field("name").as("srcTable"), id("dest").field("name").as("destTable")), g) - validateJson(r, """{ - "query":"Table as src loop (LoadProcess outputTable) as dest select src.name as srcTable, dest.name as destTable", - "dataType":{ - "typeName":"__tempQueryResultStruct2", - "attributeDefinitions":[ - { - "name":"srcTable", - "dataTypeName":"string", - "multiplicity":{ - "lower":0, - "upper":1, - "isUnique":false - }, - "isComposite":false, - "isUnique":false, - "isIndexable":true, - "reverseAttributeName":null - }, - { - "name":"destTable", - "dataTypeName":"string", - "multiplicity":{ - "lower":0, - "upper":1, - "isUnique":false - }, - "isComposite":false, - "isUnique":false, - "isIndexable":true, - "reverseAttributeName":null - } - ] - }, - "rows":[ - { - "$typeName$":"__tempQueryResultStruct2", - "srcTable":"sales_fact", - "destTable":"sales_fact_daily_mv" - }, - { - "$typeName$":"__tempQueryResultStruct2", - "srcTable":"sales_fact", - "destTable":"sales_fact_monthly_mv" - }, - { - "$typeName$":"__tempQueryResultStruct2", - "srcTable":"time_dim", - "destTable":"sales_fact_daily_mv" - }, - { - "$typeName$":"__tempQueryResultStruct2", - "srcTable":"time_dim", - "destTable":"sales_fact_monthly_mv" - }, - { - "$typeName$":"__tempQueryResultStruct2", - "srcTable":"sales_fact_daily_mv", - "destTable":"sales_fact_monthly_mv" - } - ] -}""") - } - - test("testLineageFixedDepth") { - val r = QueryProcessor.evaluate(_class("Table").loop(id("LoadProcess").field("outputTable"), int(1)), g) - validateJson(r, """{ - "query":"Table as _loop0 loop (LoadProcess outputTable) times 1", - "dataType":{ - "superTypes":[ - - ], - "hierarchicalMetaTypeName":"org.apache.hadoop.metadata.typesystem.types.ClassType", - "typeName":"Table", - "attributeDefinitions":[ - { - "name":"name", - "dataTypeName":"string", - "multiplicity":{ - "lower":0, - "upper":1, - "isUnique":false - }, - "isComposite":false, - "isUnique":false, - "isIndexable":true, - "reverseAttributeName":null - }, - { - "name":"db", - "dataTypeName":"DB", - "multiplicity":{ - "lower":1, - "upper":1, - "isUnique":false - }, - "isComposite":false, - "isUnique":false, - "isIndexable":true, - "reverseAttributeName":null - }, - { - "name":"sd", - "dataTypeName":"StorageDesc", - "multiplicity":{ - "lower":1, - "upper":1, - "isUnique":false - }, - "isComposite":false, - "isUnique":false, - "isIndexable":true, - "reverseAttributeName":null - } - ] - }, - "rows":[ - { - "$typeName$":"Table", - "$id$":{ - "id":"8960", - "$typeName$":"Table", - "version":0 - }, - "sd":{ - "id":"7424", - "$typeName$":"StorageDesc", - "version":0 - }, - "db":{ - "id":"7168", - "$typeName$":"DB", - "version":0 - }, - "name":"sales_fact_daily_mv" - }, - { - "$typeName$":"Table", - "$id$":{ - "id":"8960", - "$typeName$":"Table", - "version":0 - }, - "sd":{ - "id":"7424", - "$typeName$":"StorageDesc", - "version":0 - }, - "db":{ - "id":"7168", - "$typeName$":"DB", - "version":0 - }, - "name":"sales_fact_daily_mv" - }, - { - "$typeName$":"Table", - "$id$":{ - "id":"12800", - "$typeName$":"Table", - "version":0 - }, - "sd":{ - "id":"11264", - "$typeName$":"StorageDesc", - "version":0 - }, - "db":{ - "id":"7168", - "$typeName$":"DB", - "version":0 - }, - "name":"sales_fact_monthly_mv" - } - ] -}""") - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/30711973/repository/src/test/scala/org/apache/hadoop/metadata/query/ParserTest.scala ---------------------------------------------------------------------- diff --git a/repository/src/test/scala/org/apache/hadoop/metadata/query/ParserTest.scala b/repository/src/test/scala/org/apache/hadoop/metadata/query/ParserTest.scala deleted file mode 100755 index 44568a9..0000000 --- a/repository/src/test/scala/org/apache/hadoop/metadata/query/ParserTest.scala +++ /dev/null @@ -1,101 +0,0 @@ -/* - * 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.hadoop.metadata.query - -import org.apache.hadoop.metadata.repository.BaseTest -import org.junit.{Before, Test} - - -class ParserTest extends BaseTest { - - @Before - override def setup { - super.setup - - QueryTestsUtils.setupTypes - - } - - @Test def testFrom: Unit = { - val p = new QueryParser - println(p("from DB").right.get.toString) - } - - @Test def testFrom2: Unit = { - val p = new QueryParser - println(p("DB").right.get.toString) - } - - @Test def testJoin1: Unit = { - val p = new QueryParser - println(p("DB, Table").right.get.toString) - } - - @Test def testWhere1: Unit = { - val p = new QueryParser - println(p("DB as db1 Table where db1.name ").right.get.toString) - } - - @Test def testWhere2: Unit = { - val p = new QueryParser - println(p("DB name = \"Reporting\"").right.get.toString) - } - - @Test def testIsTrait: Unit = { - val p = new QueryParser - println(p("Table isa Dimension").right.get.toString) - println(p("Table is Dimension").right.get.toString) - } - - @Test def test4: Unit = { - val p = new QueryParser - println(p("DB where (name = \"Reporting\") select name as _col_0, (createTime + 1) as _col_1").right.get.toString) - } - - @Test def testJoin2: Unit = { - val p = new QueryParser - println(p("DB as db1 where (createTime + 1) > 0 and (db1.name = \"Reporting\") or DB has owner Table as tab " + - " select db1.name as dbName, tab.name as tabName").right.get.toString) - } - - @Test def testLoop: Unit = { - val p = new QueryParser - println(p("Table loop (LoadProcess outputTable)").right.get.toString) - } - - @Test def testNegInvalidateType: Unit = { - val p = new QueryParser - val x = p("from blah") - println(p("from blah").left) - } - - @Test def testPath1: Unit = { - val p = new QueryParser - println(p("Table loop (LoadProcess outputTable) withPath").right.get.toString) - } - - @Test def testPath2: Unit = { - val p = new QueryParser - println(p( - "Table as src loop (LoadProcess outputTable) as dest " + - "select src.name as srcTable, dest.name as destTable withPath").right.get.toString - ) - } - -} http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/30711973/repository/src/test/scala/org/apache/hadoop/metadata/query/QueryTestsUtils.scala ---------------------------------------------------------------------- diff --git a/repository/src/test/scala/org/apache/hadoop/metadata/query/QueryTestsUtils.scala b/repository/src/test/scala/org/apache/hadoop/metadata/query/QueryTestsUtils.scala deleted file mode 100755 index 94d66a9..0000000 --- a/repository/src/test/scala/org/apache/hadoop/metadata/query/QueryTestsUtils.scala +++ /dev/null @@ -1,169 +0,0 @@ -/* - * 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.hadoop.metadata.query - -import java.io.File -import javax.script.{Bindings, ScriptEngine, ScriptEngineManager} - -import com.google.common.collect.ImmutableList -import com.thinkaurelius.titan.core.{TitanFactory, TitanGraph} -import com.tinkerpop.blueprints.Vertex -import com.typesafe.config.{Config, ConfigFactory} -import org.apache.commons.configuration.{Configuration, ConfigurationException, MapConfiguration} -import org.apache.commons.io.FileUtils -import org.apache.hadoop.metadata.typesystem.types._ -import org.scalatest.{BeforeAndAfterAll, FunSuite, Assertions} - -trait GraphUtils { - - import scala.collection.JavaConversions._ - - def getConfiguration(config: Config): Configuration = { - val keys = config.entrySet().map { - _.getKey - } - val gConfig: java.util.Map[String, String] = new java.util.HashMap[String, String]() - keys.foreach { k => - gConfig.put(k, config.getString(k)) - } - return new MapConfiguration(gConfig) - } - - - def titanGraph(conf: Config) = { - try { - val g = TitanFactory.open(getConfiguration(conf)) - val mgmt = g.getManagementSystem - val typname = mgmt.makePropertyKey("typeName").dataType(classOf[String]).make() - mgmt.buildIndex("byTypeName", classOf[Vertex]).addKey(typname).buildCompositeIndex() - mgmt.commit() - g - } catch { - case e: ConfigurationException => throw new RuntimeException(e) - } - } -} - -object QueryTestsUtils extends GraphUtils { - - def setupTypes: Unit = { - def attrDef(name: String, dT: IDataType[_], - m: Multiplicity = Multiplicity.OPTIONAL, - isComposite: Boolean = false, - reverseAttributeName: String = null) = { - require(name != null) - require(dT != null) - new AttributeDefinition(name, dT.getName, m, isComposite, reverseAttributeName) - } - - def dbClsDef = new HierarchicalTypeDefinition[ClassType](classOf[ClassType], "DB", null, - Array( - attrDef("name", DataTypes.STRING_TYPE), - attrDef("owner", DataTypes.STRING_TYPE), - attrDef("createTime", DataTypes.INT_TYPE) - )) - - def storageDescClsDef = new HierarchicalTypeDefinition[ClassType](classOf[ClassType], "StorageDesc", null, - Array( - attrDef("inputFormat", DataTypes.STRING_TYPE), - attrDef("outputFormat", DataTypes.STRING_TYPE) - )) - - def columnClsDef = new HierarchicalTypeDefinition[ClassType](classOf[ClassType], "Column", null, - Array( - attrDef("name", DataTypes.STRING_TYPE), - attrDef("dataType", DataTypes.STRING_TYPE), - new AttributeDefinition("sd", "StorageDesc", Multiplicity.REQUIRED, false, null) - )) - - def tblClsDef = new HierarchicalTypeDefinition[ClassType](classOf[ClassType], "Table", null, - Array( - attrDef("name", DataTypes.STRING_TYPE), - new AttributeDefinition("db", "DB", Multiplicity.REQUIRED, false, null), - new AttributeDefinition("sd", "StorageDesc", Multiplicity.REQUIRED, false, null) - )) - - def loadProcessClsDef = new HierarchicalTypeDefinition[ClassType](classOf[ClassType], "LoadProcess", null, - Array( - attrDef("name", DataTypes.STRING_TYPE), - new AttributeDefinition("inputTables", DataTypes.arrayTypeName("Table"), Multiplicity.COLLECTION, false, null), - new AttributeDefinition("outputTable", "Table", Multiplicity.REQUIRED, false, null) - )) - - def viewClsDef = new HierarchicalTypeDefinition[ClassType](classOf[ClassType], "View", null, - Array( - attrDef("name", DataTypes.STRING_TYPE), - new AttributeDefinition("inputTables", DataTypes.arrayTypeName("Table"), Multiplicity.COLLECTION, false, null) - )) - - def dimTraitDef = new HierarchicalTypeDefinition[TraitType](classOf[TraitType], "Dimension", null, - Array[AttributeDefinition]()) - def piiTraitDef = new HierarchicalTypeDefinition[TraitType](classOf[TraitType], "PII", null, - Array[AttributeDefinition]()) - def metricTraitDef = new HierarchicalTypeDefinition[TraitType](classOf[TraitType], "Metric", null, - Array[AttributeDefinition]()) - def etlTraitDef = new HierarchicalTypeDefinition[TraitType](classOf[TraitType], "ETL", null, - Array[AttributeDefinition]()) - def jdbcTraitDef = new HierarchicalTypeDefinition[TraitType](classOf[TraitType], "JdbcAccess", null, - Array[AttributeDefinition]()) - - TypeSystem.getInstance().defineTypes(ImmutableList.of[StructTypeDefinition], - ImmutableList.of[HierarchicalTypeDefinition[TraitType]](dimTraitDef, piiTraitDef, - metricTraitDef, etlTraitDef, jdbcTraitDef), - ImmutableList.of[HierarchicalTypeDefinition[ClassType]](dbClsDef, storageDescClsDef, columnClsDef, tblClsDef, - loadProcessClsDef, viewClsDef)) - - () - } - - def setupTestGraph: TitanGraph = { - var conf = ConfigFactory.load() - conf = conf.getConfig("graphRepo") - val g = titanGraph(conf) - val manager: ScriptEngineManager = new ScriptEngineManager - val engine: ScriptEngine = manager.getEngineByName("gremlin-groovy") - val bindings: Bindings = engine.createBindings - bindings.put("g", g) - - val hiveGraphFile = FileUtils.getTempDirectory().getPath.toString + File.separator + System.nanoTime() + ".gson" - HiveTitanSample.writeGson(hiveGraphFile) - bindings.put("hiveGraphFile", hiveGraphFile) - - engine.eval("g.loadGraphSON(hiveGraphFile)", bindings) - g - } - -} - -trait BaseGremlinTest { - self : FunSuite with BeforeAndAfterAll => - - val STRUCT_NAME_REGEX = (TypeUtils.TEMP_STRUCT_NAME_PREFIX + "\\d+").r - def validateJson(r: GremlinQueryResult, expected: String = null): Unit = { - val rJ = r.toJson - if (expected != null) { - val a = STRUCT_NAME_REGEX.replaceAllIn(rJ, "") - val b = STRUCT_NAME_REGEX.replaceAllIn(expected, "") - Assertions.assert(a == b) - } else { - println(rJ) - } - } - -}
